web-dev-qa-db-ja.com

swiftにJSONを作成します

次のような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を返します。有効な辞書を作成するにはどうすればよいですか?

35
Yestay Muratov

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
61
Matt Mathias

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をネイティブに処理することは不必要な頭痛と痛みであり、時間を浪費し、読み取りと書き込みが難しく、したがって多くのエラーが発生しやすいコードを作成します。

23
zeeshan

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)
10
A.G

これは私のために働いた... 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
    }
}
4
user462990

チェックアウト 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標準型の配列、カスタムクラスの配列、継承、カスタムオブジェクトの構成をサポートしています。

3
Peheje

•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プロトコルに準拠します。

1
Baran