使用 = 将 JSON 字符串格式化为 iOS 字典字符串

Format JSON string to iOS Dictionary string with =

提问人:Glenn Posadas 提问时间:9/21/2021 最后编辑:AlexanderGlenn Posadas 更新时间:9/21/2021 访问量:167

问:

首先,我们在 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

iOS JSON Swift Objective-C 字典

评论

0赞 Larme 9/21/2021
我猜你打印了一个.要将其转换为 JSON,可以使用 .查看 stackoverflow.com/questions/29625133/...NSDictionary(NS)JSONSerialization
0赞 EmilioPelaez 9/21/2021
如果它是具有该格式的,那么它只是一个尚未解析为对象的。如果要根据对象创建具有该格式的字符串,可以使用 .StringStringCodable
0赞 Glenn Posadas 9/21/2021
谢谢两位!请看我的编辑。
0赞 Alexander 9/21/2021
“首先,在iOS中,我们怎么称呼这种格式的字典?”这没什么特别的,只是一个人类可读的打印输出。它不是标准化的序列化格式,因此不要尝试使用它。
1赞 Alexander 9/21/2021
“从字面上看,这是从服务器发送的字符串” 这是第一个问题。服务器使用字典的调试说明作为序列化格式,以便将数据传达给其客户端。这不是标准化的数据序列化格式。不要用它来做那个。“你可以使用 String 的 propertyList() 轻松地从该字符串中以这种奇怪的格式生成字典”可以吗?这是什么方法?你能把我链接到文档吗propertyList()

答:

1赞 Duncan C 9/21/2021 #1

显示的第二种格式是在调试控制台中显示对象时获得的格式。这是对象属性的输出。确切地说,它不是“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 协议的任何对象。(你的对象应该。

评论

0赞 Glenn Posadas 9/21/2021
我很感激这一点。这是我一直在使用的,但我仍然得到通常的 json 字符串格式。请参阅我编辑的问题。
1赞 Alexander 9/21/2021
“您显示的第一种格式是”漂亮打印“格式的 JSON(带有大量换行符和缩进,使其更易于阅读。不,不是。请注意,它使用的是 for 数组而不是 ,而不是 ,而不是 (也带有尾随数组),并且键没有引号。它绝对不是 JSON。它是“属性列表的文本表示形式”,如 NSString.propertyList() 所表达的那样( )[ ]=:;,
0赞 Duncan C 9/21/2021
哦,你是对的。呸。
2赞 Alexander 9/21/2021 #2

首先,我们在 iOS 中如何称呼具有这种格式的字典?

根据 NSString.propertyList() 的文档,这是一个“属性列表的文本表示”。

这是一个不稳定的、非标准的漂亮打印,通过调用 NSArray.descriptionNSDictionary.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)

评论

0赞 Larme 9/21/2021
等等。你是说我总是在我可以直接拥有用户时使用?另外,我知道它们应该是相同的(对于),但相等断言在这里可能会失败......与所有的空间、顺序等。PropertyListSerializationpropertyList()assert
0赞 Leo Dabus 9/21/2021
@Larme它确实失败了。不知道为什么,但 Apple 和 Banana 的印刷没有引号
2赞 Larme 9/21/2021
我希望它们不带引号就打印出来。SO 上有一个相关的问题(也许我会再次找到它)关于它们在印刷品中何时是引号或没有引号(因为毕竟这是它的名字),这就像文本只有 [a-zA-Z],而不是引号,是否有空格等双引号,对于数字,我不记得了......OpenStep
0赞 Larme 9/21/2021
@LeoDabus stackoverflow.com/questions/36447246/...... stackoverflow.com/questions/10520486/......还有 github.com/gnustep/libs-base/blob/master/Source/...&github.com/gnustep/libs-base/blob/master/Source/...但这是一些可能不太必要的挖掘(因为相关问题通常是关于反转的,这是不推荐的)。description
1赞 Larme 9/21/2021
在继续讨论问题之后 chat.stackoverflow.com/rooms/237295/...... 这就是正在发生的事情...... => 我建议使用 JSON(或 XML 等,但 JSON 非常“流行”)......