次のようなJSONを作成する必要があります。
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'
};
問題は、有効なJSONを作成できないことです。オブジェクトを作成する方法は次のとおりです。
let jsonObject: [AnyObject] = [
["type_id": singleStructDataOfCar.typeID, "model_id": singleStructDataOfCar.modelID, "transfer": savedDataTransfer, "hourly": savedDataHourly, "custom": savedDataReis, "device_type":"ios"]
]
savedData
は辞書です:
let savedData: NSDictionary = ["ServiceDataStartDate": singleStructdata.startofWork,
"ServiceDataAddressOfReq": singleStructdata.addressOfRequest,
"ServiceDataAddressOfDel": singleStructdata.addressOfDelivery,
"ServiceDataDetailedText": singleStructdata.detailedText, "ServiceDataPrice": singleStructdata.priceProposed]
JSONオブジェクトを作成する文字列のみを使用すると、すべて正常に動作します。ただし、辞書を含めるとNSJSONSerialization.isValidJSONObject(value)
はfalse
を返します。有効な辞書を作成するにはどうすればよいですか?
1つの問題は、このコードがDictionary
タイプではないことです。
let jsonObject: [Any] = [
[
"type_id": singleStructDataOfCar.typeID,
"model_id": singleStructDataOfCar.modelID,
"transfer": savedDataTransfer,
"hourly": savedDataHourly,
"custom": savedDataReis,
"device_type":"iOS"
]
]
上記はArray
of AnyObject
with Dictionary
of type [String: AnyObject]
の内部です。
上記のJSONと一致するように、次のようなものを試してください。
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
Swift 3.0の場合、2016年12月現在、これは私にとってどのように機能したかです。
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:SwiftyJSONライブラリを使用して時間を節約し、開発をより簡単に、より良くします。 SwiftでJSONをネイティブに処理することは不必要な頭痛と痛みであり、時間を浪費し、読み取りと書き込みが難しく、したがって多くのエラーが発生しやすいコードを作成します。
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)
これは私のために働いた... 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
}
}
チェックアウト https://github.com/peheje/JsonSerializerSwift
使用事例:
//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
現在、標準型、オプションの標準型、配列、nullables標準型の配列、カスタムクラスの配列、継承、カスタムオブジェクトの構成をサポートしています。
•Swift 4.1、2018年4月
より一般的なアプローチは、辞書の値を使用してJSON文字列を作成するために使用できます。
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
}
}
使用方法:
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.
// ...
}
注:カスタムタイプ(構造体)のインスタンスを辞書に追加する場合は、タイプがCodable
プロトコルに準拠していることを確認し、カスタムクラスのオブジェクトを辞書に追加する場合は、クラスがNSObject
およびNSCoding
プロトコルに準拠します。