在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")
答
你应该使用这样的数组?打印您的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正确的表示,你应该转换jsonData
到String
。
答
当您打印斯威夫特对象,斯威夫特调试器是免费的但它要打印出来,这只是为了方便,没有任何关于格式的保证。因此,它打印在括号阵列。
另一方面,当您将它转换为JSON时,它创建JSON字符串,并且JSON为数组指定格式,其中包括方括号。
更新:在再次阅读问题后,在我看来,您的印象是您正在打印对象的JSON表示形式。你不是。你目前所做的是将Swift对象转换为JSON,然后将其转换回Swift对象。然后打印生成的Swift对象(请参阅我的答案的第1段)。因此,如果您的目标是打印JSON表示,则需要将jsonData转换为String(请参阅其他答案),并打印该字符串。您不应该再次使用NSJSONSerialization
进行反向转换。
谢谢。这样做后打印结果是“{\”arr \“:[1,2,3,4]}”。可以吗?有些反斜杠可以吗? – rick
这是好的。反斜杠是虚拟的,它们需要在文字字符串中显示双引号。 – vadian