提问人:Glenn Posadas 提问时间:9/21/2021 最后编辑:AlexanderGlenn Posadas 更新时间:9/21/2021 访问量:167
使用 = 将 JSON 字符串格式化为 iOS 字典字符串
Format JSON string to iOS Dictionary string with =
问:
首先,我们在 iOS 中如何称呼具有这种格式的字典?
(
{
name = "Apple";
value = "fruit-1";
},
{
name = "Banana";
value = "fruit-2";
}
)
对于我的主要问题。我不知何故需要格式化JSON字符串,如下所示:
[{"name":"Apple","value":"fruit-1"},{"name":"Banana","value":"fruit-2"}]
转换为(上面的字符串)的任何格式。
就上下文而言,我的项目的现有方法使用 CoreData,其中服务器响应(使用上面的神秘格式)在本地保存为 String,我想遵循该格式。
编辑:为了获得更多上下文,我真的需要将第一种格式放入数据库,因为构建了一个项目的模块来读取该格式的数据(例如,使用 NSString.propertyList()
)。
使用一个名为 的库,我可以看到设备中保存的对象。ios hierarchy viewer
原始格式,服务器json到db(核心数据)在Objective-C中:
我一直在尝试在 Swift 中做什么,使用服务器 json 到本地:JSONSerialization
答:
显示的第二种格式是在调试控制台中显示对象时获得的格式。这是对象属性的输出。确切地说,它不是“JSON 字符串”。description
如果要将对象转换为真正的 JSON 字符串,请参见下文。
正如 Alexander 所指出的,您问题中的第一个字符串是 NSString 函数的输出。该格式看起来与“漂亮打印”的 JSON 非常相似,但它的不同之处在于它不会以这种方式工作。propertyList()
'propertyList() 函数是一个仅用于调试的函数,我不知道现有的方法可以将其解析回对象。如果这是您的服务器发送的字符串,则您的服务器已损坏。如果这是您在记录字段内容时在核心数据中看到的内容,则可能是您的误解。
要将对象转换为漂亮的 JSON,请参阅此答案,我在其中创建了一个 Encodable 格式的扩展,该扩展实现了属性“prettyJSON”:
extension Encodable {
var prettyJSON: String {
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
guard let data = try? encoder.encode(self),
let output = String(data: data, encoding: .utf8)
else { return "Error converting \(self) to JSON string" }
return output
}
}
这应该适用于支持 Encodable 协议的任何对象。(你的对象应该。
评论
NSString.propertyList()
所表达的那样( )
[ ]
=
:
;
,
首先,我们在 iOS 中如何称呼具有这种格式的字典?
根据 NSString.propertyList()
的文档,这是一个“属性列表的文本表示”。
这是一个不稳定的、非标准的漂亮打印,通过调用 NSArray.description
或 NSDictionary.description
获得。
下面是一个显示数据往返的示例:
// The opening `{` indentation is fucky, but that's how it's generated.
let inputPropertyList = """
(
{
name = "Apple";
value = "fruit-1";
},
{
name = "Banana";
value = "fruit-2";
}
)
"""
// The result is an `Any` because we don't know if the root structure
// of the property list is an array or a dictionary
let deserialized: Any = inputPropertyList.propertyList()
// If you want the description in the same format, you need to cast to
// Foundation.NSArray or Foundation.NSDictionary.
// Swift.Array and Swift.Dictionary have a different description format.
let nsDict = deserialized as! NSArray
let roundTrippedPropertyList = nsDict.description
print(roundTrippedPropertyList)
assert(roundTrippedPropertyList == inputPropertyList)
评论
PropertyListSerialization
propertyList()
assert
OpenStep
description
评论
NSDictionary
(NS)JSONSerialization
String
String
Codable
propertyList()