J'ai besoin de créer JSON comme ceci:
Order = { type_id:'1',model_id:'1',
transfer:{
startDate:'10/04/2015 12:45',
endDate:'10/04/2015 16:00',
startPoint:'Ул. Момышулы, 45',
endPoint:'Аэропорт Астаны'
},
hourly:{
startDate:'10/04/2015',
endDate:'11/04/2015',
startPoint:'ЖД Вокзал',
endPoint:'',
undefined_time:'1'
},
custom:{
startDate:'12/04/2015',
endDate:'12/04/2015',
startPoint:'Астана',
endPoint:'Павлодар',
customPrice:'50 000'
},
commentText:'',
device_type:'ios'
};
Le problème est que je ne peux pas créer de JSON valide. Voici comment je crée un objet:
let jsonObject: [AnyObject] = [
["type_id": singleStructDataOfCar.typeID, "model_id": singleStructDataOfCar.modelID, "transfer": savedDataTransfer, "hourly": savedDataHourly, "custom": savedDataReis, "device_type":"ios"]
]
où savedData
sont des dictionnaires:
let savedData: NSDictionary = ["ServiceDataStartDate": singleStructdata.startofWork,
"ServiceDataAddressOfReq": singleStructdata.addressOfRequest,
"ServiceDataAddressOfDel": singleStructdata.addressOfDelivery,
"ServiceDataDetailedText": singleStructdata.detailedText, "ServiceDataPrice": singleStructdata.priceProposed]
Lorsque je n'utilise que des chaînes créant mon objet JSON, tout fonctionne correctement. Cependant, lorsque j'inclus des dictionnaires, NSJSONSerialization.isValidJSONObject(value)
renvoie false
. Comment créer un dictionnaire valide?
Un problème est que ce code n'est pas de type Dictionary
.
let jsonObject: [Any] = [
[
"type_id": singleStructDataOfCar.typeID,
"model_id": singleStructDataOfCar.modelID,
"transfer": savedDataTransfer,
"hourly": savedDataHourly,
"custom": savedDataReis,
"device_type":"iOS"
]
]
Ce qui précède est un Array
de AnyObject
avec un Dictionary
de type [String: AnyObject]
à l'intérieur de celui-ci.
Essayez quelque chose comme ceci pour correspondre au JSON que vous avez fourni ci-dessus:
let savedData = ["Something": 1]
let jsonObject: [String: Any] = [
"type_id": 1,
"model_id": 1,
"transfer": [
"startDate": "10/04/2015 12:45",
"endDate": "10/04/2015 16:00"
],
"custom": savedData
]
let valid = JSONSerialization.isValidJSONObject(jsonObject) // true
Pour Swift 3.0, à compter de décembre 2016, voici comment cela a fonctionné pour moi:
let jsonObject: NSMutableDictionary = NSMutableDictionary()
jsonObject.setValue(value1, forKey: "b")
jsonObject.setValue(value2, forKey: "p")
jsonObject.setValue(value3, forKey: "o")
jsonObject.setValue(value4, forKey: "s")
jsonObject.setValue(value5, forKey: "r")
let jsonData: NSData
do {
jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: JSONSerialization.WritingOptions()) as NSData
let jsonString = NSString(data: jsonData as Data, encoding: String.Encoding.utf8.rawValue) as! String
print("json string = \(jsonString)")
} catch _ {
print ("JSON Failure")
}
EDIT 2018: J'utilise maintenant la bibliothèque SwiftyJSON pour gagner du temps et rendre ma vie de développement plus facile et meilleure. Traiter nativement avec JSON dans Swift est un casse-tête et une douleur inutiles, il fait perdre trop de temps et crée un code difficile à lire et à écrire, et donc sujet à de nombreuses erreurs.
Création d'une chaîne JSON:
let para:NSMutableDictionary = NSMutableDictionary()
para.setValue("bidder", forKey: "username")
para.setValue("day303", forKey: "password")
para.setValue("authetication", forKey: "action")
let jsonData = try! NSJSONSerialization.dataWithJSONObject(para, options: NSJSONWritingOptions.allZeros)
let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String
print(jsonString)
Cela a fonctionné pour moi ... Swift 2
static func checkUsernameAndPassword(username: String, password: String) -> String?{
let para:NSMutableDictionary = NSMutableDictionary()
para.setValue("demo", forKey: "username")
para.setValue("demo", forKey: "password")
// let jsonError: NSError?
let jsonData: NSData
do{
jsonData = try NSJSONSerialization.dataWithJSONObject(para, options: NSJSONWritingOptions())
let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String
print("json string = \(jsonString)")
return jsonString
} catch _ {
print ("UH OOO")
return nil
}
}
Départ https://github.com/peheje/JsonSerializerSwift
Cas d'utilisation:
//Arrange your model classes
class Object {
var id: Int = 182371823
}
class Animal: Object {
var weight: Double = 2.5
var age: Int = 2
var name: String? = "An animal"
}
class Cat: Animal {
var fur: Bool = true
}
let m = Cat()
//Act
let json = JSONSerializer.toJson(m)
//Assert
let expected = "{\"fur\": true, \"weight\": 2.5, \"age\": 2, \"name\": \"An animal\", \"id\": 182371823}"
stringCompareHelper(json, expected) //returns true
Prend actuellement en charge les types standard, les types standard facultatifs, les tableaux, les tableaux de types standard nullables, un tableau de classes personnalisées, l'héritage, la composition d'objets personnalisés.
• Swift 4.1, avril 2018
Voici une approche plus générale qui peut être utilisée pour créer une chaîne JSON en utilisant les valeurs d'un dictionnaire:
struct JSONStringEncoder {
/**
Encodes a dictionary into a JSON string.
- parameter dictionary: Dictionary to use to encode JSON string.
- returns: A JSON string. `nil`, when encoding failed.
*/
func encode(_ dictionary: [String: Any]) -> String? {
guard JSONSerialization.isValidJSONObject(dictionary) else {
assertionFailure("Invalid json object received.")
return nil
}
let jsonObject: NSMutableDictionary = NSMutableDictionary()
let jsonData: Data
dictionary.forEach { (arg) in
jsonObject.setValue(arg.value, forKey: arg.key)
}
do {
jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted)
} catch {
assertionFailure("JSON data creation failed with error: \(error).")
return nil
}
guard let jsonString = String.init(data: jsonData, encoding: String.Encoding.utf8) else {
assertionFailure("JSON string creation failed.")
return nil
}
print("JSON string: \(jsonString)")
return jsonString
}
}
Comment l'utiliser:
let exampleDict: [String: Any] = [
"Key1" : "stringValue", // type: String
"Key2" : boolValue, // type: Bool
"Key3" : intValue, // type: Int
"Key4" : customTypeInstance, // type: e.g. struct Person: Codable {...}
"Key5" : customClassInstance, // type: e.g. class Human: NSObject, NSCoding {...}
// ...
]
if let jsonString = JSONStringEncoder().encode(exampleDict) {
// Successfully created JSON string.
// ...
} else {
// Failed creating JSON string.
// ...
}
Remarque: Si vous ajoutez des occurrences de vos types personnalisés (structures) dans le dictionnaire, assurez-vous que vos types sont conformes au protocole Codable
. Si vous ajoutez des objets de vos classes personnalisées dans le dictionnaire, assurez-vous que vos classes héritent de NSObject
et conforme au protocole NSCoding
.