如何在ios Swift中将JSON转换为String?

Div*_*raj 22 json ios swift

以下是Json输出的代码:

let params : [[String : AnyObject]]  = [["name" : "action", "value" : "pay" ],["name" : "cartJsonData" , "value" : ["total": 1,"rows":[["quantity": “1” ,"title":"Donation for SMSF India - General Fund","price":"1","itemId":"DN001","cost": “1”,”currency":"INR"]]]], ["name" : "center", "value" : "Chennai"], ["name" : "flatNumber", "value" : "503"], ["name" : "panNumber", "value" : ""], ["name" : "payWith"], ["name" : "reminderFrequency","value" : "Monthly"],  ["name" : "shipToAddr1"], ["name" : "shipToAddr2"], ["name" : "shipToCity"], ["name" : "shipToCountryName" , "value" : "India"], ["name" : "shipToEmail", "value" : “01034_186893@gmail.com"], ["name" : "shipToFirstName" , "value": "4480101010"], ["name" : "shipToLastName"], ["name" : "shipToPhone", "value" : "4480101010"], ["name" : "shipToState"], ["name" : "shipToZip"], ["name" : "userId", "value" : “null”], ["name" : "shipToCountry", "value" : "IN"]]

var jsonObject: NSData? = nil

do {
   jsonObject = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions())
   print(jsonObject) // This will print the below json. 
} 
catch{}
Run Code Online (Sandbox Code Playgroud)

通过打印jsonObject,我得到了这个.

[{"value":"pay","name":"action"},{"value":{"rows":[{"price":"1","quantity":"1","cost" :"1","currency":"INR","itemId":"DN001","title":"SMSF印度捐赠 - 普通基金"}],"总数":1},"名称":"cartJsonData "},{"value":"Chennai","name":"center"},{"value":"503","name":"flatNumber"},{"value":"","name" :"panNumber"},{"name":"payWith"},{"value":"Monthly","name":"reminderFrequency"},{"name":"shipToAddr1"},{"name":" shipToAddr2"},{"name":"shipToCity"},{"value":"India","name":"shipToCountryName"},{"value":"01034_186893@gmail.com","name":" shipToEmail"},{"value":"4480101010","name":"shipToFirstName"},{"name":"shipToLastName"},{"value":"4480101010","name":"shipToPhone"}, {"name":"shipToState"},{"name":"shipToZip"},{"value":"null","name":"userId"},{"value":"IN","name" :"shipToCountry"}]

我希望JSON采用以下格式.

[{"name":"action","value":"pay"},{"name":"cartJsonData","value":"{\"total \":1,\"rows \":[{ \"itemId \":\"DN002 \",\"title \":\"为SMSF印度捐赠 - 普通基金\",\"数量\":\"100 \",\"currency \":\" INR \",\"价格\":\"1 \",\"费用\":\"100 \"}]}"},{"名称":"中心","价值":"钦奈"} ,{"name":"flatNumber","value":""},{"name":"panNumber","value":"ASSDDBBDJD"},{"name":"payWith"},{"name" :"reminderFrequency","value":"Monthly"},{"name":"shipToAddr1"},{"name":"shipToAddr2"},{"name":"shipToCity"},{"name":" shipToCountryName","value":"India"},{"name":"shipToEmail","value":"Sudhakar@gmail.com"},{"name":"shipToFirstName","value":"Raju" },{"name":"shipToLastName"},{"name":"shipToPhone","value":"1234567890"},{"name":"shipToState"},{"name":"shipToZip"},{"name":"userId","value":"null"},{"name ":"shipToCountry","value":"IN"}]

怎么做到呢?只cartJsonData需要更改值.有人可以帮我解决这个问题吗?

ak *_*cha 34

试试这个.

func jsonToString(json: AnyObject){
        do {
          let data1 =  try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted) // first of all convert json to the data
            let convertedString = String(data: data1, encoding: NSUTF8StringEncoding) // the data will be converted to the string
            print(convertedString) // <-- here is ur string  

        } catch let myJSONError {
            print(myJSONError)
        }

    }
Run Code Online (Sandbox Code Playgroud)


Ben*_*erd 12

斯威夫特 (截至2018年7月10日)

func jsonToString(json: AnyObject){
    do {
        let data1 =  try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted) // first of all convert json to the data
        let convertedString = String(data: data1, encoding: String.Encoding.utf8) // the data will be converted to the string
        print(convertedString ?? "defaultvalue")
    } catch let myJSONError {
        print(myJSONError)
    }

}
Run Code Online (Sandbox Code Playgroud)

  • Swift 3不仅仅是使用更改后的API语法。在Swift 3 JSON中,`Any`,可以省略`options'参数(在问题中不打算使用prettyPrinted),`convertedString`永远不能为'nil'(即使在Swift 2中也是如此),并且在`catch`范围内,可以简单地`print(error)`,而无需分配'let'。 (2认同)

Min*_*ang 9

Swift 4.0

static func stringify(json: Any, prettyPrinted: Bool = false) -> String {
    var options: JSONSerialization.WritingOptions = []
    if prettyPrinted {
      options = JSONSerialization.WritingOptions.prettyPrinted
    }

    do {
      let data = try JSONSerialization.data(withJSONObject: json, options: options)
      if let string = String(data: data, encoding: String.Encoding.utf8) {
        return string
      }
    } catch {
      print(error)
    }

    return ""
}
Run Code Online (Sandbox Code Playgroud)

用法

stringify(json: ["message": "Hello."])
Run Code Online (Sandbox Code Playgroud)


Mar*_*ius 5

使用新的基于 Encodable 的 API,您可以使用 String(init:encoding) 初始化程序获取 JSON 文件的字符串版本。我在操场上运行了这个,最后的打印语句给了我

json {"year":1961,"month":4}
Run Code Online (Sandbox Code Playgroud)

从细节来看,该格式似乎使用了最少的字符数。

struct Dob: Codable {
    let year: Int
    let month: Int
}

let dob = Dob(year: 1961, month: 4)
print("dob", dob)

if let dobdata = try? JSONEncoder().encode(dob) {
    print("dobdata base64", dobdata.base64EncodedString())
    if let ddob = try? JSONDecoder().decode(Dob.self, from: dobdata) {
        print("resetored dob", ddob)
    }
    if let json = String(data: dobdata, encoding: .utf8) {
      print("json", json)
    }
}
Run Code Online (Sandbox Code Playgroud)