【问题标题】:How to convert JSON to String in ios Swift?如何在 ios Swift 中将 JSON 转换为字符串?
【发布时间】:2016-07-22 02:22:47
【问题描述】:

下面是 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{}

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

[{ "value": "pay", "name": "action" }, { "value": { "rows": [{ “价格”:“1”,“数量”:“1”,“成本”:“1”,“货币”:“INR”, “itemId”:“DN001”,“title”:“为 SMSF India 捐款 - 普通基金” }],“总计”:1 },“名称”:“cartJsonData”},{“价值”:“钦奈”, “名称”:“中心”},{“值”:“503”,“名称”:“flatNumber”},{ “价值”:“”,“名称”:“panNumber”},{“名称”:“payWith”},{“价值”: “每月”,“名称”:“提醒频率”},{“名称”:“shipToAddr1”},{ “名称”:“shipToAddr2”},{“名称”:“shipToCity”},{“价值”:“印度”, “名称”:“shipToCountryName”},{“价值”:“01034_186893@gmail.com”, “名称”:“shipToEmail”},{“值”:“4480101010”,“名称”: "shipToFirstName" }, { "name": "shipToLastName" }, { "value": “4480101010”,“名称”:“shipToPhone”},{“名称”:“shipToState”},{ "name": "shipToZip" }, { "value": "null", "name": "userId" }, { “值”:“IN”,“名称”:“shipToCountry”}]

我希望 JSON 采用以下格式。

[{ “name”: “action”, “value”: “pay” }, { “name”: “cartJsonData”, “价值”: “{\”total\”:1,\”rows\”:[{\”itemId\”:\”DN002\”,\”title\”:\”捐赠 SMSF 印度 - 一般 资金\”,\”数量\”:\”100\”,\”货币\”:\”INR\”,\”价格\”:\”1\”,\”成本\”:\”100\ ”}]}” }, { “name”: “center”, “value”: “Chennai” }, { “name”: “flatNumber”, “值”:“”},{“名称”:“panNumber”,“值”:“ASSDDBBDJD”},{ “姓名”:“payWith”},{“姓名”:“提醒频率”,“价值”:“每月” },{“名称”:“shipToAddr1”},{“名称”:“shipToAddr2”},{“名称”: “shipToCity”},{“名称”:“shipToCountryName”,“值”:“印度”},{ “名称”:“shipToEmail”,“值”:“Sudhakar@gmail.com”},{“名称”: “shipToFirstName”,“值”:“Raju”},{“名称”:“shipToLastName”},{ “名称”:“shipToPhone”,“值”:“1234567890”},{“名称”: “shipToState” }, { “name”: “shipToZip” }, { “name”: “userId”, “value”: “null” }, { “name”: “shipToCountry”, “value”: “IN” }]

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

【问题讨论】:

  • 使用try语法jsonObject永远不会是nil
  • 是什么让您对输出感到困扰?看起来它是一个有效的json。我猜你不喜欢你的键和值顺序被改变的事实。在这种情况下你不能修复它,因为字典不保留键的顺序,我的意思是你仍然可以通过某种方式解决这个问题自己输出 json 或使用其他库来执行此操作,但这听起来不值得。
  • 顺便说一句,也许你会对WritingOptions.sortedKeys 选项感兴趣

标签: ios json swift


【解决方案1】:

试试这个。

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

    }

【讨论】:

  • 谢谢! Swift 3.1 转换也在下面!
  • 请参阅上面的注释 (stackoverflow.com/a/47725685/826946),了解在您想要生成可用于比较一个 JSON 与另一个 JSON 的规范字符串时使用排序。
【解决方案2】:

Swift (截至 2020 年 12 月 3 日)

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

【讨论】:

  • Swift 3 不仅仅是使用改变的 API 语法。在 Swift 3 JSON 中是 Anyoptions 参数可以省略(prettyPrinted 不是问题中的意图),convertedString 永远不能是 nil(即使在 Swift 2 中)并且在 catch 范围内你可以简单地 print(error) 没有 let 分配。
【解决方案3】:

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

用法

stringify(json: ["message": "Hello."])

【讨论】:

  • 如果您需要将 Json 与 Json 进行比较,则在此处添加排序的使用 - 您的选项应如下所示:options: [JSONSerialization.WritingOptions.sortedKeys, JSONSerialization.WritingOptions.prettyPrinted]。否则键的顺序可能不同,因此逻辑上相同的结构可能会产生不同的字符串。
  • 另见stackoverflow.com/a/46037539/826946,这是我从中获取排序参数的地方。
【解决方案4】:

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

json {"year":1961,"month":4}

似乎该格式使用了最少的字符数。

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

【讨论】:

    【解决方案5】:

    将 JSON 对象转换为字符串的简单方法是: 1. 首先创建一个 JSON 下标值,例如jsonObject["fieldName"] 2.使用'.stringValue'属性检索实际的String等价(jsonObject["fieldName"].stringValue)

    【讨论】:

      【解决方案6】:
      • 斯威夫特 4.x
      • xcode 10.x

      如果你使用的是 Swifty JSON

      var stringfyJSOn  = yourJSON.description
      

      供参考或了解更多信息

      https://github.com/SwiftyJSON/SwiftyJSON

      【讨论】:

      • 这个答案不起作用。如果 JSON 数据是 Data 对象,则它不起作用。你需要先做这个操作: let data = try JSONSerialization.data(withJSONObject: json, options: options) if let string = String(data: data, encoding: String.Encoding.utf8) { return string }
      • @wazowski 感谢您添加有用的评论,但根据问题,它只是 JSON 并没有提及 JSON 数据,但如果它是数据,则可以。会工作,请再次阅读问题
      • 你是对的,这个问题问了一个问题,但是代码告诉其他人,当你从 url 会话中收到一个数据对象时,你没有收到像 [String:Any] 字典这样的 Json 对象,问题的代码没有显示真正的 JSON 数据,问题应该是“如何将字典转换为字符串?”。
      • 现在在 iOS 中使用任何 json 库都是一个非常糟糕的主意。它绝对内置于 Swift/iOS
      【解决方案7】:

      Xcode 11,将 String 转换为 NSString 对我有用。

      func jsonToString(json: AnyObject) -> String{
          do {
              let data1 = try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted)
              let convertedString = String(data: data1, encoding: String.Encoding.utf8) as NSString? ?? ""
              debugPrint(convertedString)
              return convertedString as String
          } catch let myJSONError {
              debugPrint(myJSONError)
              return ""
          }
      }
      

      【讨论】:

      • 当我使用这个时,我得到这个错误“Argument type 'JSON' expected to be an instance of a class or class-constrained type”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多