使用 = 将 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)