首先,在iOS中,我們如何稱呼這樣格式的字典?
(
{
name = "Apple";
value = "fruit-1";
},
{
name = "Banana";
value = "fruit-2";
}
)
而對于我的主要問題。我需要格式化一個JSON字串,像這樣:
[{"name"/span>。 "Apple","value"。 "fruit-1"},{"name": "Banana","value"。 "fruit-2"}]/span>
進入該格式的任何內容(上面的字串)。
為了說明情況,我的專案的現有方法是使用CoreData,其中服務器回應(使用上述的神秘格式)被保存為本地的字串,而我希望遵循該格式。
編輯:為了了解更多的情況,我真的只需要將第一種格式輸入資料庫,因為一個專案的模塊被構建為使用該格式讀取資料(例如,利用
NSString.propertyList())。
使用一個名為ios hierarchy viewer的庫,我可以看到設備中保存的物件。
原始格式,服務器json到db(核心資料)在Objective-C中:
我一直想在Swift中做的,使用JSONSerialization將服務器json轉到本地:
uj5u.com熱心網友回復:
首先,在iOS中,我們該如何稱呼這樣格式的字典呢?
根據NSString.propertyList()的檔案,那是一個 "屬性串列的文本表示"。
這是通過呼叫NSArray.description或NSDictionary.description而獲得的一種古怪的、非標準的漂亮列印。
下面是一個顯示資料往返的例子:
// 開頭的`{`縮進很糟糕,但這就是它的生成方式。
let inputPropertyList = """
(
{
name = "蘋果"。
value = "fruit-1"。
},
{
name = "Banana";
value = "fruit-2"。
}
)
"""
///結果是一個`Any`,因為我們不知道根結構是否存在。
//屬性串列是一個陣列還是一個字典。
let deserialized: Any = inputPropertyList.propertyList()
//如果你想獲得相同格式的描述,你需要投遞到。
// Foundation.NSArray 或 Foundation.NSDictionary.。
// Swift.Array和Swift.Dictionary有不同的描述格式。
let nsDict = deserialized as! NSArray
let roundTrippedPropertyList = nsDict.description
print(roundTrippedPropertyList)
assert(roundTrippedPropertyList == inputPropertyList)
uj5u.com熱心網友回復:
你顯示的第二種格式是你在除錯控制臺中顯示一個物件時得到的東西。那是該物件的description屬性的輸出。確切地說,它并不是一個 "JSON字串"。
如果你想將你的物件轉換為真正的JSON字串,請參閱下文。
正如 Alexander 所指出的,你問題中的第一個字串是 NSString 的 propertyList() 函式的輸出。該格式看起來與 "漂亮列印 "的 JSON 非常相似,但它的不同之處在于它不會以這種方式作業。
`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協議的物件。(你的物件也應該如此。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/321915.html
標籤:
