2015-04-08 9 views
24

muszę utworzyć JSON tak:Tworzenie JSON w szybki

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' 
}; 

Problemem jest to, że nie można utworzyć poprawny JSON. Oto jak utworzyć obiekt:

let jsonObject: [AnyObject] = [ 
     ["type_id": singleStructDataOfCar.typeID, "model_id": singleStructDataOfCar.modelID, "transfer": savedDataTransfer, "hourly": savedDataHourly, "custom": savedDataReis, "device_type":"ios"] 
    ] 

gdzie savedData są słowniki:

let savedData: NSDictionary = ["ServiceDataStartDate": singleStructdata.startofWork, 
"ServiceDataAddressOfReq": singleStructdata.addressOfRequest, 
"ServiceDataAddressOfDel": singleStructdata.addressOfDelivery, 
"ServiceDataDetailedText": singleStructdata.detailedText, "ServiceDataPrice": singleStructdata.priceProposed] 

Kiedy stosować tylko łańcuchy tworzące mój obiekt JSON wszystko działa bez zarzutu. Jednak po dodaniu słowników NSJSONSerialization.isValidJSONObject(value) zwraca false. Jak mogę utworzyć poprawny słownik?

+0

starają się śledzić ten tutorial https://medium.com/swift-programming/4-json-in- swift-144bf5f88ce4 – EnriMR

+0

Tak, czerwony ten artykuł. W tym artykule nsdictionary zawiera tylko wartości łańcuchowe. W moim przypadku var transfer, hourly, custom ma wiele wartości. to nie jest ciąg ... więc jak mam je uwzględnić? –

+0

let jsonObject: [AnyObject] = [ ["typ_id": singleStructDataOfCar.typeID, "identyfikator_modelu": singleStructDataOfCar.modelID, "transfer": [data_początku] "startDate": savedDataTransfer ["ServiceDataStartDate"] jako ciąg, "EndPoint": savedDataTransfer ["ServiceDataAddressOfDel"] jako String, "CommentText": savedDataTransfer ["ServiceDataDetailedText"] jako String, "StartPoint": savedDataTransfer ["ServiceDataAddressOfReq"] jako String ] ] //, "cogodzinne": savedDataHourly, "custom" : savedDataReis, "device_type": "ios"] ] –

Odpowiedz

45

Jednym z problemów jest to, że ten kod nie jest typu Dictionary.

let jsonObject: [Any] = [ 
    [ 
     "type_id": singleStructDataOfCar.typeID, 
     "model_id": singleStructDataOfCar.modelID, 
     "transfer": savedDataTransfer, 
     "hourly": savedDataHourly, 
     "custom": savedDataReis, 
     "device_type":"iOS" 
    ] 
] 

Powyższe jest Array z AnyObject z Dictionary typu [String: AnyObject] wewnątrz niego.

Spróbuj coś takiego, aby dopasować JSON podanych powyżej:

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 
+1

To prawda, ale chcę dać okrzyk do kapsuły SwiftyJSON dla każdego, kto przyjdzie następny. Może być przydatne. – sammysounder

+0

SwiftyJSON ma świetną implementację do tego. Ta aktualna odpowiedź jest niepoprawna, ale po zainstalowaniu SwiftyJSON wystarczy zmienić '[String: AnyObject' na' JSON' i jest ona ważna. Później, gdy próbujesz uzyskać wartość jako słownik, po prostu wpisz 'jsonData.dictionaryObject' i tam to masz! –

+0

Zmieniono '[String: AnyObject]' na '[String: Any]' tak, że przykładowy kod się kompiluje. Pierwotnie użyłem 'AnyObject' w powyższym, aby' jsonObject' mógł mieć instancje klasy wewnątrz niego. –

8

Tworzenie JSON String:

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) 
4

Ten pracował dla mnie ... 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 
    } 
} 
1

Check out https://github.com/peheje/JsonSerializerSwift

przypadków użycia:

//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 

Obecnie obsługuje standardowe typy, opcjonalne typy standardowe, tablice, tablice nullables standardowych typów, tablicę niestandardowych klas, dziedziczenia składu obiektów niestandardowych.

+0

Mam json, który ma jedną właściwość, która sama jest tablicą niestandardowego obiektu. Podczas uruchamiania przez JsonSerialization.toJson, to traci wartości i otrzymuję coś w stylu: "key": [{}, {}] wszelkie myśli, jak obejść to? – user2363025

+0

Działa z tablicą niestandardowych obiektów. Sprawdź plik testowy GitHub, aby dowiedzieć się, jak to zrobić. Przypadek testowy nazywa się test_arrayOfCustomClass_included – Peheje

+0

Zmieniłem strukturę na klasę i zadziałało. Jakiekolwiek wsparcie dla struktur jako obiektów niestandardowych? – user2363025

18

Dla Swift 3.0, z grudnia 2016, to jak to pracował dla mnie:

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") 
}