Разбор JSON в Swift с Alamofire - PullRequest
       20

Разбор JSON в Swift с Alamofire

0 голосов
/ 28 октября 2019

У меня проблемы с попыткой выяснить, как вернуть только одну часть моих данных JSON с помощью Swift 4.

Это JSON, который мне нужно проанализировать:

{
  "code": 0,
  "responseTS": 1571969400172,
  "message": "TagPosition",
  "version": "2.1",
  "command": "http://123.456.7.89:8080/tag=a4da22e02925",
  "tags": [
    {
      "smoothedPosition": [
        -0.58,
        -3.57,
        0.2
      ],
      "color": "#FF0000",
      "positionAccuracy": 0.07,
      "smoothedPositionAccuracy": 0.07,
      "zones": [],
      "coordinateSystemId": "687eba45-7af4-4b7d-96ed-df709ec1ced1",
      "areaId": "987537ae-42f3-4bb5-8d0c-79fba8752ef4",
      "coordinateSystemName": "CoordSys001",
      "covarianceMatrix": [
        0.04,
        0.01,
        0.01,
        0.05
      ],
      "areaName": "area",
      "name": null,
      "positionTS": 1571969399065,
      "id": "a4da22e02925",
      "position": [
        -0.58,
        -3.57,
        0.2
      ]
    }
  ],
  "status": "Ok"
}

Пока что я могу вернуть все массивы тегов, показанные ниже. Однако мне просто нужно вернуть только данные «smoothothedPosition».

    func newTest() {
        Alamofire.request(url).responseJSON { (response) in

            if let newjson = response.result.value as! [String: Any]? {
                print(newjson["tags"] as! NSArray)
            }
        }

    }

Будет ли alamofire хорошим способом получить желаемый результат? Ранее я пытался использовать метод Codable, но поскольку в моем JSON есть много разных частей, мне показалось странным просто получить ту часть, которая мне нужна. Если бы кто-нибудь мог дать мне несколько советов о том, как лучше всего это сделать, я был бы признателен.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Это хороший вариант для создания пользовательской структуры или класса Codable для ответа JSON. Вы можете реализовать только как переменную-член, которую хотите достичь.

struct CustomResponse: Codable {
    let tags: [Tag]
}

struct Tag: Codable {
    let smoothedPosition: Position
}

struct Position: Codable {
   let x: Float
   let y: Float
   let z: Float
}

Тогда

Alamofire.request(url).responseJSON { (response as? CustomResponse) in
    guard let response = response else { return }
    print(response.tags.smoothedPosition)
}

Также вы можете вручную глубже проанализировать свой ответ JSON, как указано в других ответах.

0 голосов
/ 28 октября 2019

Better not to use NS classes with Swift wherever possible. So instead of NSArray use Array.

Чтобы получить smoothedPosition, вам нужно разобрать больше. tags дает вам array of dictionaries, поэтому вам нужно зациклить массив и получить каждый словарь внутри tags array. Тогда, наконец, вы можете получить массив smoothedPosition.

func newTest() {
    Alamofire.request(url).responseJSON { (response) in
        if let newjson = response.result.value as? [String: Any], if let tagArray = newjson["tags"] as? [[String: Any]] {
            for object in tagArray {
                if let smoothedPosition = object["smoothedPosition"] as? [Double] {
                    print(smoothedPosition)
                }
            }
        }
    }
}
  • Также вам следует прочитать больше о codables до parse nested data и узнать о optional binding and chaining, чтобы предотвратить сбои приforce (!) что-то, что в какой-то момент может быть нулевым.

  • Вы можете использовать этот сайт для проверки возможной структуры Codable согласно вашему ответу: https://app.quicktype.io/

...