Как я могу декодировать JSON с массивом и большим количеством JSON внутри? - PullRequest
0 голосов
/ 16 мая 2018

Я недавно начал с swift.Мне нужно расшифровать JSON ниже.

Внутри JSON есть еще два JSON, первый (валидация) не имеет значения.Второй (результат) имеет массив JSON внутри (serviceCenter).Мне нужна информация о каждом сервисном центре.Я пытаюсь использовать servicecenter в качестве декодируемого класса для получения объекта servicenter, но поскольку JSON не имеет надлежащего формата, я не могу этого сделать.

[
  {
    "validation": {
      "bValid": true,
      "sDescription": "Access true."
    }
  },
  {
    "result": {
      "serviceCenter": [
        {
          "model": "Vanquish",
          "color": "Purple",
          "make": "Aston Martin",
          "sTag": "3666",
          "sVin": "6JDO2345",
          "sMiles": "3666",
          "bDamage": "1",
          "dDateTime": "04-17-2018 9:38 AM"
        },
        {
          "model": "F360",
          "color": "Red",
          "make": "Ferrari",
          "sTag": "0010",
          "sVin": "6JDO2347",
          "sMiles": "80000",
          "bDamage": "1",
          "dDateTime": "04-17-2018 9:25 AM"
        },
        {
          "model": "Vanquish",
          "color": "Purple",
          "make": "Aston Martin",
          "sTag": "0009",
          "sVin": "6JDO2345",
          "sMiles": "25000",
          "bDamage": "1",
          "dDateTime": "04-17-2018 9:23 AM"
        },
        {
          "model": "Vanquish",
          "color": "Purple",
          "make": "Aston Martin",
          "sTag": "0003",
          "sVin": "6JDO2345",
          "sMiles": "20000",
          "bDamage": "1",
          "dDateTime": "04-12-2018 10:37 AM"
        }
      ]
    }
  }
]

Я стараюсь, но не могу этого сделать.

Теперь это мой код, может кто-нибудь помочь мне, пожалуйста

do {
    let parseoDatos = try JSONSerialization.jsonObject(with: data!) as! [AnyObject]
    let h = type(of: parseoDatos )
    print("'\(parseoDatos)' of type '\(h)'")
    let contenido = parseoDatos[1]["result"]

    if let services = contenido!! as? Dictionary<String, Array<Any>> {               
        for (_,serviceArray) in services {
            for sc in serviceArray{
                let h = type(of: sc )
                print("'\(sc)' of type '\(h)'")                        
            }
        }
    }
} catch {
    print("json processing failed")
}

результат печати sc равен

{
    bDamage = 1;
    color = Purple;
    dDateTime = "04-17-2018 9:38 AM";
    make = "Aston Martin";
    model = Vanquish;
    sMiles = 3666;
    sTag = 3666;
    sVin = 6JDO2345;
}' of type '__NSDictionaryI'

Ответы [ 4 ]

0 голосов
/ 22 мая 2018
//try this it is working

let arrayMain=try?JSONSerialization.jsonObject(with:jsonData!,options:.mutableLeaves) as! Array<Any>


//print(arrayMain!)

if let firstDictionart=arrayMain![0] as? [String: Any] {
    if let insideFirstDict = firstDictionart["validation"] as? [String: Any]{
       print(insideFirstDict["bValid"]!)
         print( insideFirstDict["sDescription"]!)

    }

}
if let resultDictionary=arrayMain![1] as? [String: Any] {
    if let serviceDictionary = resultDictionary["result"] as? [String: Any] {
        for array in serviceDictionary["serviceCenter"] as! Array<Any>{
            if let infoDicti=array as? [String: Any]  {
                print( infoDicti["color"]!)
                print( infoDicti["make"]!)
                print(  infoDicti["color"]!)
                print( infoDicti["sTag"]!)
                print( infoDicti["sVin"]!)
                print( infoDicti["sMiles"]!)
                print( infoDicti["sVin"]!)
                print( infoDicti["model"]!)
                print( infoDicti["bDamage"]!)
                print( infoDicti["dDateTime"]!)         
            } 
        }
      }

    }
0 голосов
/ 16 мая 2018

Вы можете использовать Codable

Начальный ответ имеет массив InitialElement и InitialElement is struct со validation, result, результатможет быть ноль

не забудьте добавить свой URL на url

URLSession.shared.dataTask(with: url!) { (data, response, error) in

                     if  let initial =  try? JSONDecoder().decode([InitialElement].self, from: data){

                         // inital now have array of InitialElement and InitialElement is is struct with validation , result  , result may be nil


                        print(initial)
                        }
                    }.resume()

С этой моделью для данных:

import Foundation

struct InitialElement: Codable {
    let validation: Validation?
    let result: ResultData?
}

struct ResultData: Codable {
    let serviceCenter: [ServiceCenter]
}

struct ServiceCenter: Codable {
    let model, color, make, sTag: String
    let sVin, sMiles, bDamage, dDateTime: String
}

struct Validation: Codable {
    let bValid: Bool
    let sDescription: String
}


extension InitialElement {
    init(data: Data) throws {
        self = try JSONDecoder().decode(InitialElement.self, from: data)
    }
}
0 голосов
/ 16 мая 2018

Спасибо всем за ваши ответы, это мой первый вопрос здесь, и я чувствую себя прекрасно, вся помощь. Наконец я могу решить проблему. Может быть, не самый лучший способ, но вот его код:

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
        if error != nil{
            print("error=\(String(describing: error))")
            return
        }
        do {

            let parseoDatos = try JSONSerialization.jsonObject(with: data!) as! [AnyObject]
            let h = type(of: parseoDatos )
            print("'\(parseoDatos)' of type '\(h)'")
            let contenido = parseoDatos[1]["result"]


            if let services = contenido!! as? Dictionary<String, Array<Any>> {
                for (_,serviceArray) in services {
                    for sc in serviceArray{
                        let h = type(of: sc )
                        print("'\(sc)' of type '\(h)'")
                        let valid = JSONSerialization.isValidJSONObject(sc) // true
                        print(valid)
                        do {
                            let jsonData = try JSONSerialization.data(withJSONObject: sc, options: .prettyPrinted)
                            let serviceDecoded = try JSONSerialization.jsonObject(with: jsonData, options: [])
                            if let scJSON = serviceDecoded as? [String:String] {
                                print ("--------------------------")
                                print("'\(scJSON)' of type '\(type(of: scJSON))'")
                                print ("--------------------------")


                            }
                        } catch {
                            print(error.localizedDescription)
                        }

Я думаю, что позже вы попробуете использовать Codable, как это было предложено, но сейчас код работает нормально. Еще раз спасибо!

0 голосов
/ 16 мая 2018

попробуйте этот код

enum ParsingError: Error {
    case wrongFormat(String)
}

do {
    let jsonObject = try JSONSerialization.jsonObject(with: data!)
    guard let array = jsonObject as? [Any] else {
        throw ParsingError.wrongFormat("wrong root object")
    }
    guard array.count == 2 else {
        throw ParsingError.wrongFormat("array count != 2")
    }
    guard let dict = array[1] as? [String: Any] else {
        throw ParsingError.wrongFormat("can't parse dict from array")
    }
    guard let serviceCenters = (dict["result"] as? [String: Any])?["serviceCenter"] else {
        throw ParsingError.wrongFormat("can't parse serviceCenters")
    }
    guard let serviceCentersArray = serviceCenters as? [[String : Any]] else {
        throw ParsingError.wrongFormat("serviceCenters is not an array")
    }

    print("\(type(of: serviceCentersArray))\n", serviceCentersArray)

} catch {
    print("json processing failed: \(error)")
}
...