使用 swiftyjson 和 swift 解析嵌入的 json

Posted

技术标签:

【中文标题】使用 swiftyjson 和 swift 解析嵌入的 json【英文标题】:parse embedded json using swiftyjson and swift 【发布时间】:2016-05-26 07:52:37 【问题描述】:

所以我尝试使用 swiftyjson 从这个 json 文件中解析出这个嵌入的值,但我不知道如何从 json 中取出嵌入的东西。

这就是我目前所拥有的,它适用于获取 json 的上层,但不适用于嵌套项目。我需要这个文件的主要内容是项目名称和项目中创建的值的项目部分。

  if let data = json.dataUsingEncoding(NSUTF8StringEncoding) 
        let newJson = JSON(data: data)
        myBarcode = newJson["barcode_id"].stringValue
        myName = newJson["name"].stringValue
        myTotalPointsEarned = newJson["total_points_earned"].stringValue
        myPointsEarned = newJson["points_available_to_spend"].stringValue
        myRank = newJson["rank"].stringValue
        myId = newJson["id"].stringValue
        //new json arrary to get the items and dates
        var myHistory = newJson["order_history"].arrayValue
        print("\n My Hist \n" , myHistory)

        //FAIL
        //var myItems = newJson["items"].stringValue
        //print("\n My Items \n" , myItems)
    

这是我要解析的 json 文件


 "id" : "xxx",
 "name" : "xfgsfsdfs",
 "total_points_earned" : null,
 "points_available_to_spend" : null,
 "rank" : null,
 "barcode_id" : "C-00000252",
 "order_history" : [ 
    "items" : [ 
       "id" : 284,
       "created" : [ 2016, 5, 26, 5, 27, 53 ],
       "updated" : [ 2016, 5, 26, 5, 27, 53 ],
       "sku" : "10-10-08-050",
       "name" : "Halloween stuff",
       "description" : "",
  "quantity" : 1.0,
  "price" : 2000.0,
  "total" : 2000.0,
  "tax" : null,
  "discount" : null
, 
  "id" : 285,
  "created" : [ 2016, 5, 26, 5, 27, 53 ],
  "updated" : [ 2016, 5, 26, 5, 27, 53 ],
  "sku" : "10-22-12-247",
  "name" : "More Xmas stuff",
  "description" : "",
  "quantity" : 1.0,
  "price" : 2300.0,
  "total" : 2300.0,
  "tax" : null,
  "discount" : null
, 
  "id" : 286,
  "created" : [ 2016, 5, 26, 5, 27, 53 ],
  "updated" : [ 2016, 5, 26, 5, 27, 53 ],
  "sku" : "10-22-12-249",
  "name" : "Xmas stuff",
  "description" : "",
  "quantity" : 1.0,
  "price" : 3700.0,
  "total" : 3700.0,
  "tax" : null,
  "discount" : null
 ],
"items" : [ 
  "id" : 288,
  "created" : [ 2016, 5, 26, 5, 29, 51 ],
  "updated" : [ 2016, 5, 26, 5, 29, 51 ],
  "sku" : "JJ-02-00-042",
  "name" : "A sample product name",
  "description" : "",
  "quantity" : 1.0,
  "price" : 3000.0,
  "total" : 3000.0,
  "tax" : null,
  "discount" : null
 ]

 
 ]
 

感谢您对此的任何帮助

【问题讨论】:

我在回答中犯了一个小错误 :) 正如 Eric 所指出的,我不应该在使用 swifty json 时解开数据 :) 如果您有任何问题,请查看更新的答案: ) 【参考方案1】:

MNM,

您可以访问项目

var myItems = newJson["order_history"][0]["items"]

绝对不需要为每个键创建单独的 json。

【讨论】:

那行得通,我不知道你可以这样做。我仍在学习 ios 大约 2 周前开始。我添加了一个循环去思考它并打印出整个列表。谢谢你,我真的很感激 @mnm : 很高兴你解决了,伙计 :) 编码快乐 :) Sandeep 的解决方案是正确的如果你不使用 SwiftyJSON。如果您使用的是这个框架,那么您不必像这样自己解包值,SwiftyJSON 会这样做,请参阅我的答案作为示例。 @eric-d : 完美的观察先生 :) 我会修改答案,因为他正在使用 swifty json :) 我赞成你的答案 :)【参考方案2】:

您正在使用 SwiftyJSON,所以请使用它的功能!

例如,使用键路径访问值:

var id = newJson["order_history",0,"items",0,"id"]

另外,经典的 SwiftyJSON 方式(类似于原生 Swift,但无需解包值):

var id = newJson["order_history"][0]["items"][0]["id"]

【讨论】:

【参考方案3】:

根据documentation。 .stringValue 如果值为 JSON 字符串类型,则返回 String。您不能使用它“将其从当前具有的任何类型转换为 String”。所以如果它是一个 JSON 数组,.stringValue 将返回一个""

如果要获取值的原始(未解析)JSON 字符串,请使用.rawString()

在你的情况下,你可以这样做:

for item in newJson["items"].arrayValue 
  // do something with the item

【讨论】:

以上是关于使用 swiftyjson 和 swift 解析嵌入的 json的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中使用alamofire和swiftyjson解析分页url?

在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)

swift、Alamofire、SwiftyJSON:如何解析 arrayObject

如何使用 SwiftyJSON 在 Swift 中解析这个 JSON 对象?

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

使用 swiftyJSON/swift 从 Firebase 解析排行榜数据