【问题标题】:How do take the values from a large JSON response with multiple arrays and brackets?如何从具有多个数组和括号的大型 JSON 响应中获取值?
【发布时间】:2019-09-23 19:24:58
【问题描述】:

我有一个 JSON 响应(超过 500 行),里面有几个数组和括号。基本上是一个过度嵌套的响应。

我正在使用 Alamofire 进行获取,我得到一个 JSONData 作为响应。但我不知道如何从响应中获取值并将其打印在自定义单元格上。

我正在使用 Alamofire 5 来获取 JSON 响应。

如果这听起来太新手,请原谅,我是 iOS 开发的新手。

{
    "availabilityResultList": [
        {
            "availabilityRouteList": [
                {
                    "availabilityByDateList": [
                        {
                            "originDestinationOptionList": [
                                {
                                    "fareComponentGroupList": [
                                        {
                                            "boundList": [
                                                {
                                                    "availFlightSegmentList": [
                                                        {
                                                            "addOnSegment": false,
                                                            "flightSegment": {
                                                                "journeyDuration": "PT1H15M",
                                                                "distance": 1,
                                                                "departureAirport": {
                                                                    "locationName": "LOC",
                                                                    "cityInfo": {
                                                                        "country": {
                                                                            "locationName": "LOC",
                                                                            "currency": {
                                                                                "code": "USD"
                                                                            },
                                                                            "locationCode": "LOC",
                                                                            "locationNameLanguage": "EN"
                                                                        },
                                                                        "city": {
                                                                            "locationName": "LOC",
                                                                            "locationCode": "LOC",
                                                                            "locationNameLanguage": "EN"
                                                                        }
                                                                    },
                                                                    "codeContext": "ASD",
                                                                    "language": "EN",
                                                                    "locationCode": "LOC"
                                                                },
                                                                "equipment": {
                                                                    "airEquipType": "ABC",
                                                                    "changeofGauge": false
                                                                },
                                                                "remark": "NO",
                                                                "ticketType": "PP",
                                                                "onTimeRate": 0,
                                                                "flightNotes": [
                                                                    {
                                                                        "deiCode": 0
                                                                    }
                                                                ],
                                                                "flightSegmentID": "",
                                                                "flownMileageQty": 0,
                                                                "flightNumber": "106",
                                                                "groundDuration": "",
                                                                "trafficRestriction": {
                                                                    "code": "",
                                                                    "explanation": {}
                                                                },
                                                                "stopQuantity": 0,
                                                                "codeshare": false,
                                                                "secureFlightDataRequired": false,
                                                                "departureDateTime": {
                                                                    "month": 5,
                                                                    "hour": 6,
                                                                    "year": 2019,
                                                                    "timezone": 270,
                                                                    "day": 6,
                                                                    "minute": 45,
                                                                    "second": 0
                                                                },
                                                                "ondControlled": false,
                                                                "arrivalDateTime": {
                                                                    "month": 5,
                                                                    "hour": 8,
                                                                    "year": 2019,
                                                                    "timezone": 270,
                                                                    "day": 6,
                                                                    "minute": 0,
                                                                    "second": 0
                                                                },
                                                                "airline": {
                                                                    "code": "RQ"
                                                                },
                                                                "arrivalAirport": {
                                                                    "locationName": "LOC",
                                                                    "cityInfo": {
                                                                        "country": {
                                                                            "locationName": "AA",
                                                                            "currency": {
                                                                                "code": "USD"
                                                                            },
                                                                            "locationCode": "AA",
                                                                            "locationNameLanguage": "EN"
                                                                        },
                                                                        "city": {
                                                                            "locationName": "loc",
                                                                            "locationCode": "LOC",
                                                                            "locationNameLanguage": "EN"
                                                                        }
                                                                    },
                                                                    "codeContext": "ASD",
                                                                    "language": "EN",
                                                                    "locationCode": "LOC"
                                                                },
                                                                "sector": "ASD",
                                                                "accumulatedDuration": ""
                                                            },
                                                            "marriageGroup": "-1"
                                                        }
                                                    ],
                                                    "boundCode": "Outbound"
                                                }
                                            ]
                                        }
                                    ]
                                },

【问题讨论】:

  • 您尝试显示的值是什么,到目前为止您使用 swiftyjson 尝试过什么?
  • 不要使用 swiftyjson,使用内置的 json 支持,Codeable。网上有很多关于它的信息,还有这里的问答。您可以使用app.quicktype.io 获取与您的 json 消息相对应的 swift 结构,这将为您提供一个良好的开端
  • 显示你尝试过的代码
  • @Mohammad Reza Farahani 我正在尝试显示旅程持续时间、距离、位置名称、代码、位置代码、城市、机票类型、备注、航班号、停止数量、出发日期时间、到达日期时间,(从到达机场 - > 地点名称、地点代码、) 和婚姻代码
  • @Joakim Danielson 谢谢,我不知道那个网站。我现在正在尝试。

标签: ios json swift alamofire swifty-json


【解决方案1】:

JSON 是一种非常简单且易于阅读的格式。只有两种不同的集合类型和四种值类型。

  • {} 是字典,按键下标
  • [] 是一个数组,下标是索引(从零开始)

  • 双引号中的所有内容都是String,甚至是"123""false"
  • falsetrueBool
  • 数值为Double,没有小数位Int
  • <null>NSNull

使用 SwiftyJSON,您可以在 flightSegment 中获得 distanceroot 代表顶级对象`)

root["availabilityResultList"][0]["availabilityRouteList"][0]["availabilityByDateList"][0]["originDestinationOptionList"][0]["fareComponentGroupList"][0]["boundList"][0]["availFlightSegmentList"][0]["flightSegment"]["distance"]

【讨论】:

  • 我试过这个,但必须为每个项目都这样做非常困难(我认为这是不好的做法)。我正在寻找一种更快/更简单的方法。有吗?
  • 实际上与Codable 没有区别。您只能使用较短的名称。使用结构,您将获得distanceroot.availabilityResultList.first.availabilityRouteList.first.availabilityByDateList.first.originDestinationOptionList.first.fareComponentGroupList.first.boundList.first.availFlightSegmentList.first.flightSegment.distance。您可以将availFlightSegmentList 的对象分配给一个变量并从那里导航
  • 如果我使用这种方法,我将如何将数据放入可重复使用的自定义单元格中的标签中? (如果我使用相同的代码,我将获取第一个单元格的数据,我如何获取剩余单元格的数据(如果有)。例如,有 3 个航班可用,每个航班都有所有这些详细信息,每个单元格显示单个航班的详细信息。)
  • 查看我的第一个编辑评论。将包含航班(一次)的数组分配给一个变量并从那里导航。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多