programing

신속한 JSON 생성

closeapi 2023. 4. 6. 21:40
반응형

신속한 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유효한 사전을 작성하려면 어떻게 해야 합니까?

한 가지 문제는 이 코드가 유형이 아니라는 것입니다.Dictionary.

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

상기의 내용은ArrayAnyObject와 함께Dictionary타입의[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

2016년 12월 현재 Swift 3.0의 작동 방식은 다음과 같습니다.

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

2018년 편집 : SwiftyJ 사용SON 라이브러리: 시간을 절약하고 개발 생활을 더 쉽고 좋게 만듭니다.스위프트에서 네이티브로 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 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.
        // ...
    }

주의: 커스텀타입(구조) 인스턴스를 딕셔너리에 추가할 경우 유형이 다음 조건을 충족하는지 확인하십시오.Codableprotocol 및 커스텀클래스의 오브젝트를 사전에 추가하는 경우 클래스가 다음에서 상속되는지 확인합니다.NSObject에 준거하고 있습니다.NSCoding프로토콜입니다.

이건 나한테 효과가 있었어...스위프트 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
    }
}

스위프트 5 - 6/30/21

코드화 프로토콜 채택(다른 프로그래밍 언어의 인터페이스와 유사)

struct ConfigRequestBody: Codable {
var systemid: String
var password: String
var request: String = "getconfig"

init(systemID: String, password: String){
    self.systemid = systemID
    self.password = password
}

}

JSON으로 변환할 구조/클래스의 인스턴스를 만듭니다.

let requestBody = ConfigRequestBody(systemID: systemID, password: password)

를 사용하여 오브젝트를 JSON으로 인코딩합니다.JSONEncoder결과를 확인할 수 있도록 문자열 표현을 인쇄합니다.

    let encoder = JSONEncoder()
    encoder.outputFormatting = .prettyPrinted
    do {
        let result = try encoder.encode(requestBody)
        // RESULT IS NOW JSON-LIKE DATA OBJECT
        if let jsonString = String(data: result, encoding: .utf8){
            // JSON STRING
            print("JSON \(jsonString)")
        }
    } catch {
        print("Your parsing sucks \(error)")
        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

현재 표준 유형, 옵션 표준 유형, 어레이, nullable 표준 유형 배열, 커스텀 클래스 배열, 상속, 커스텀 객체 구성을 지원합니다.

SwiftyJ 사용SON: JSON 문자열을 생성합니다.에서 배우다comments매트의 대답하나죠

@2022/10

let savedData = ["Something": 1]

var json = JSON()

json.dictionaryObject = [ 
    "type_id": 1,
    "model_id": 1,
    "transfer": [
        "startDate": "10/04/2015 12:45",
        "endDate": "10/04/2015 16:00"
    ],
    "custom": savedData
]

let jsonStr = json.rawString()

언급URL : https://stackoverflow.com/questions/29512839/create-json-in-swift

반응형