使用 = 将 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,其中服务器响应(使用上面的神秘格式)在本地保存为字符串,我想遵循该格式。
编辑:对于更多上下文,我真的需要将第一种格式放入数据库,因为构建了一个项目模块来读取具有该格式的数据(例如,使用 NSString.propertyList()
)。
使用名为 ios hierarchy viewer
的库,我可以在设备中看到保存的对象。
原始格式,服务器 json 到 Objective-C 中的数据库(核心数据):
我在 Swift 中尝试做的事情,服务器 json 到本地使用 JSONSerialization
:
您显示的第二种格式是您在调试控制台中显示对象时得到的格式。这是对象的 description
属性 的输出。确切地说,它不是“JSON 字符串”。
如果您想将对象转换为真正的 JSON 字符串,请参阅下文。
正如 Alexander 所指出的,您问题中的第一个字符串是 NSString 的 propertyList()
函数的输出。该格式看起来与“漂亮印刷”非常相似JSON,但它的不同之处在于它不会以这种方式工作。
`属性List() 函数是一个仅供调试的函数,我不知道现有的方法可以将它解析回对象。如果这是您的服务器发送的字符串,则您的服务器已损坏。如果这是您在记录字段内容时在核心数据中看到的内容,那可能是您的误解。
要将对象转换为漂亮的 JSON,请参阅 ,我在其中创建了实现 属性“漂亮JSON”的 Encodable 格式的扩展:
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 协议的任何对象。 (你的对象应该。)
First off, what do we call a dictionary with a format like this in iOS?
根据 NSString.propertyList()
的文档,这是“属性 列表的文本表示”。
这是通过调用 NSArray.description
or 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)
首先,在 iOS 中,我们如何称呼具有这种格式的字典?
(
{
name = "Apple";
value = "fruit-1";
},
{
name = "Banana";
value = "fruit-2";
}
)
关于我的主要问题。我不知何故需要格式化一个 JSON 的字符串,像这样:
[{"name":"Apple","value":"fruit-1"},{"name":"Banana","value":"fruit-2"}]
转换为(上述字符串的)任何格式。
对于上下文,我的项目的现有方法使用 CoreData,其中服务器响应(使用上面的神秘格式)在本地保存为字符串,我想遵循该格式。
编辑:对于更多上下文,我真的需要将第一种格式放入数据库,因为构建了一个项目模块来读取具有该格式的数据(例如,使用 NSString.propertyList()
)。
使用名为 ios hierarchy viewer
的库,我可以在设备中看到保存的对象。
原始格式,服务器 json 到 Objective-C 中的数据库(核心数据):
我在 Swift 中尝试做的事情,服务器 json 到本地使用 JSONSerialization
:
您显示的第二种格式是您在调试控制台中显示对象时得到的格式。这是对象的 description
属性 的输出。确切地说,它不是“JSON 字符串”。
如果您想将对象转换为真正的 JSON 字符串,请参阅下文。
正如 Alexander 所指出的,您问题中的第一个字符串是 NSString 的 propertyList()
函数的输出。该格式看起来与“漂亮印刷”非常相似JSON,但它的不同之处在于它不会以这种方式工作。
`属性List() 函数是一个仅供调试的函数,我不知道现有的方法可以将它解析回对象。如果这是您的服务器发送的字符串,则您的服务器已损坏。如果这是您在记录字段内容时在核心数据中看到的内容,那可能是您的误解。
要将对象转换为漂亮的 JSON,请参阅
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 协议的任何对象。 (你的对象应该。)
First off, what do we call a dictionary with a format like this in iOS?
根据 NSString.propertyList()
的文档,这是“属性 列表的文本表示”。
这是通过调用 NSArray.description
or 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)