在Json中快速使用数组

问题描述:

当我在我的JSON对象中添加一个数组并将其转换为JSON时,打印后有括号而不是大括号。在Json中快速使用数组

var jsonObject : [String: Any] = [:] 

var x = [1,2,3,4] 
jsonObject["arr"] = x 
do{ 
    let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: []) 

    let decoded = try JSONSerialization.jsonObject(with: jsonData, options: []) 
    print(decoded) 
} ... 

和打印结果:

{ 
arr = (
     1, 
     2, 
     3, 
     4 
    ); 
} 

但JSON,以显示它使用的[代替(

什么是错

你的字典转换成JSON,然后你其转换回并打印(!)。

要打印你必须写

let jsonData = try JSONSerialization.data(withJSONObject: jsonObject) 
let jsonString = String(data: jsonData, encoding: .utf8) 
print(jsonString ?? "Wrong data") 
+0

谢谢。这样做后打印结果是“{\”arr \“:[1,2,3,4]}”。可以吗?有些反斜杠可以吗? – rick

+1

这是好的。反斜杠是虚拟的,它们需要在文字字符串中显示双引号。 – vadian

你应该使用这样的数组?打印您的JSON。

public extension Collection { 

    /// Convert self to JSON String. 
    /// - Returns: Returns the JSON as String or empty string if error while parsing. 
    func json() -> String { 
     do { 
      let jsonData = try JSONSerialization.data(withJSONObject: self, options: [.prettyPrinted]) 
      guard let jsonString = String(data: jsonData, encoding: String.Encoding.utf8) else { 
       print("Error creating string with data.") 
       return "{}" 
      } 
      return jsonString 
     } catch let parseError { 
      print("json serialization error: \(parseError)") 
      return "{}" 
     } 
    } 
} 

转换是正确的,它只是打印解码版本,它是快速字典,而不是JSON。

var jsonObject : [String: Any] = [:] 

var x = [1,2,3,4] 
jsonObject["arr"] = x 
print(jsonObject.json()) 
do{ 
    let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: []) 

    let decoded = try JSONSerialization.jsonObject(with: jsonData, options: []) 
    print(decoded) 
} 

输出: -

{ 
    "arr" : [ 
    1, 
    2, 
    3, 
    4 
    ] 
} 

我加了一些打印条款,你的代码,并粘贴控制台日志的评论JSON字符串。

var jsonObject : [String: Any] = [:] 

var x = [1,2,3,4] 
jsonObject["arr"] = x 
print(type(of: jsonObject)) // Dictionary<String, Any> 
do{ 
    let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted) 

    let decoded = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) 
    print(type(of: decoded)) // __NSSingleEntryDictionaryI 

    let str = String(data: jsonData, encoding: .utf8) 
    print(str!) /* { 
    "arr" : [ 
     1, 
     2, 
     3, 
     4 
     ] 
    }*/ 
} 

正如你所看到的,decoded类型是__NSSingleEntryDictionaryI,因此印刷它的结果是不是如你所预期的,用“(”,而不是“[”如果你想在JSON正确的表示,你应该转换jsonDataString

当您打印斯威夫特对象,斯威夫特调试器是免费的但它要打印出来,这只是为了方便,没有任何关于格式的保证。因此,它打印在括号阵列。

另一方面,当您将它转换为JSON时,它创建JSON字符串,并且JSON为数组指定格式,其中包括方括号。

更新:在再次阅读问题后,在我看来,您的印象是您正在打印对象的JSON表示形式。你不是。你目前所做的是将Swift对象转换为JSON,然后将其转换回Swift对象。然后打印生成的Swift对象(请参阅我的答案的第1段)。因此,如果您的目标是打印JSON表示,则需要将jsonData转换为String(请参阅其他答案),并打印该字符串。您不应该再次使用NSJSONSerialization进行反向转换。