【问题标题】:Add json objects to array将json对象添加到数组
【发布时间】:2018-07-20 04:01:56
【问题描述】:

单击提交按钮后,我的文本字段中的数据和其他一些数据将被转换为 json 对象,如下所示……

    let categoryName = self.categoryTextField.text
    let categoryId = self.categoryID

    let category_json: [String: [String:Any]] = [
        "categoryDetails": [
            "category_name": categoryName,
            "category_id": categoryId
        ]
    ]

    if let data = try? JSONSerialization.data(withJSONObject: category_json, options: .prettyPrinted),
        let str = String(data: data, encoding: .utf8) {
        print(str) // `str` gives the json object 
        self.categoryStrToPass = str
    }

现在self.categoryStrToPass 被分配给另一个 json 对象,然后最终像这样添加到字符串数组中……

    let productID = self.prodID
    let sellingPrice = self.mrpTextField.text
    let categoryJSON = self.categoryStrToPass

    let jsonObject: [String: [String:Any]] = [
        "prodDetails": [
            "product_id": productID,
            "selling_price": sellingPrice,
    “category_json”: categoryJSON

        ]
    ]

    if let data = try? JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted),
        let str = String(data: data, encoding: .utf8) {
        print(str)
        self.jsonStrToPass = str
        self.jsonStringArray.append(self.jsonStrToPass)
    }

现在我像这样将jsonStringArray 存储到 coredata...

_product?.setValue(self.jsonStringArray, forKey:
            "productJsonArray") // productJsonArray is an attribute of type Transformable and Custom class type Array<String>

它正在像这样被提取......

 if let jsonObjArr = result.value(forKey: "productJsonArray") as?
                        Array<NSString> {
                    print(jsonObjArr)

                    } 

现在我在 2 个不同的实例上提交了数据,这意味着在获取时打印 jsonObjArr,它应该在一个数组中有 2 个不同的 json 对象,就像这样..

[{
  "prodDetails" : {
    "product_id" : "0",
    "category_json" : "{\n  \"categoryDetails\" : {\n    \"category_id\" : \"0\",\n    \"category_name\" : \"prodCAT\"\n  }\n}",
    "selling_price" : "500",
  }
}

{
  "prodDetails" : {
    "product_id" : "1",
    "category_json" : "{\n  \"categoryDetails\" : {\n    \"category_id\" : \"0\",\n    \"category_name\" : \"CATNEW\"\n  }\n}",
    "selling_price" : "1000",
  }
}]

但相反,打印 jsonObjArr 会给出这个......在 2 个不同的数组中......

[{
  "prodDetails" : {
    "product_id" : "0",
    "category_json" : "{\n  \"categoryDetails\" : {\n    \"category_id\" : \"0\",\n    \"category_name\" : \"prodCAT\"\n  }\n}",
    "selling_price" : "500",
  }
}]

[{
  "prodDetails" : {
    "product_id" : "1",
    "category_json" : "{\n  \"categoryDetails\" : {\n    \"category_id\" : \"0\",\n    \"category_name\" : \"CATNEW\"\n  }\n}",
    "selling_price" : "1000",
  }
}]

如何在一个数组中获取多个 json 对象...?

【问题讨论】:

  • self.jsonStringArray.append(self.jsonStrToPass) 您正在附加两个字符串化的 JSON,它不起作用。相反,附加在“Swift Array 表单”上,然后转换为 JSON。
  • 好的@Larme。如果您能提出如何建议,您将不胜感激……我已经坚持了一段时间了……:(

标签: ios json swift core-data


【解决方案1】:

您可以像这样将 [String: Any] 类型的对象添加到数组中

let firstCategoryName = "first"
let firstCategoryId = 1

let firstCategory = [
    "category_name": firstCategoryName,
    "category_id": firstCategoryId
] as [String : Any]

let secondCategoryName = "second"
let secondCategoryId = 2

var category_json = [[String:Any]]()

category_json.append(firstCategory)

let secondCategory = [
    "category_name": secondCategoryName,
    "category_id": secondCategoryId
    ] as [String : Any]

category_json.append(secondCategory)

print(category_json)

然后序列化数组

【讨论】:

  • 在我的情况下,第一个 json 放在第二个 json 中。在我的问题中,第一个 json 被分配给这个变量:self.categoryStrToPass 而这又被分配给第二个 json,就像这样......let categoryJSON = self.categoryStrToPass let jsonObject: [String: [String:Any]] = [ "prodDetails": [ "product_id": productID, "selling_price": sellingPrice, “category_json”: categoryJSON ]
  • 你的答案也能用在那种情况下吗...?
  • 是的,因为数组被定义为 [String: Any] 所以你可以添加 json 对象
  • 但是你还没有将数据转换成字符串。那么我们怎样才能得到正确格式的输出呢..?
【解决方案2】:

Swift 4.0:

    let firstObj = ["prodDetails": [
                   "product_id": 5,
                   "selling_price": 6,
                   ]]

    let secondObj = ["prodDetails1": [
                    "product_id1": 5,
                    "selling_price1": 6,
                    ]]

    let jsonObject = jsonStringArray.addingObjects(from: [firstObj,secondObj])

    if let data = try? JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted),

        let str = String(data: data, encoding: .utf8) {
        print(str) //prints array of dictionaries
    }

【讨论】:

  • 谢谢@Suganya Marlin。但最后我将只有一个 json 对象。正是这个 json 对象被添加到数组中。现在,如果我创建一个新产品(它与我的项目相关,并且当数据进入 json 对象时),新的数据集将再次附加到数组中。这似乎也不存在addingObjects(from..
  • 你应该将你的数组声明为 NSArray()。然后你会得到它
【解决方案3】:

category_jsonjsonObject 属于同一类。

你需要了解的:

(NS)String String(data:encoding) 或 data(encoding:) ==> (NS)Data

应用于特定的字符串/数据:JSON:

JSON 字符串化 String(data:encoding) 或 data(encoding:) ==> JSON 数据

Swift Array/Swift(以及其他 JSON 兼容)(NS)JSONSerialization.jsonObject(withData:, options:) 或 (NS)JSONSerialization.data(withJSONObject:, options:) ==> JSON 数据

你不能像这样附加两个 JSON Stringified,你需要至少在顶层有一个数组。

所以,让我们用伪代码连接这些点(完全不确定方法名称是否没有错误)

let currentData = self.jsonStrToPass.data(encoding: .utf8)
let current = JSONSerialization.jsonObject(with:currentData, options:[]) as [String:[String:Any]]

let finalArray : [[String:[String:Any]]]()
finalArray.append(current)
finalArray.append(jsonObject)

let finalData = JSONSerialization.data(withJSONObject:finalArray, options:[])
let finalString = String(data:finalData, encoding:.utf8)

这就是逻辑。 if lettry/catch等不是我做的。

我认为在要传递的数据之间传递 Any(对于 Swift Array/Dictionary 而不是 String)可能会更好。编辑它们(追加等)而不是字符串可能更简单。

【讨论】:

  • 好的@Larme。谢谢...所以finalString 会是一个包含多个字典的数组吗...?
  • finalStringfinalArray 的 JSONStringified。应该是这样。
  • .@Larme 在按照您的建议进行操作后,我将 finalString 添加到字符串数组并将其存储在 coredata 中。如果我有 2 组数据,我将在数组中获得 2 个字典,但是当我检索时,我在第一个数组中获得两次第一组数据,在第二个数组中获得两次第二组数据..而不是1个数组中的两组不同数据...
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多