Попробуйте разобрать json в объекте класса fail - PullRequest
1 голос
/ 24 апреля 2019

Мне нужна помощь для разбора JSON с помощью Swift. Я не мог разобрать их в массив объекта класса с помощью swift. Я попробовал связать значение ключа json в массив объекта и вернуть. Однако я не смог разобраться с типами. Это так смущает.

Может ли кто-нибудь мне помочь.

JSON у меня есть:

{ 
 "mass_info1":
  [{
    "mass_id":7780, 
    "mass_date":"5/1/2019", 
    "mass_time":"7:30 PM", 
    "mass_location":"", 
    "mass_description": “Blah1” 
  } ] , 
 "mass_info2":
  [ { 
    "mass_id":7781, 
    "mass_date":"6/10/2019", 
    "mass_time":"7:30 PM", 
    "mass_location”:”1234 some place Los Angeles”, 
    "mass_description": “blah2” 
  } ] , 
 "mass_info3":
  [ { 
    "mass_id":7783, 
    "mass_date":"5/21/2019", 
    "mass_time":"7:30 PM", 
    "mass_location":"", 
    "mass_description": “blah3” 
  } ] , 
 "mass_info4":
  [ {
    "mass_id":1115, 
    "mass_date":"4/5/2019", 
    "mass_time":"2:30 PM", 
    "mass_location":"4050 Mission Ave, Oceanside, CA 92057", 
    "mass_description": “blah4”
  } ] 
}

Класс MassInfoObject import Foundation

struct MassInfoObject {
    var mass_id:Int
    var mass_date: String?
    var mass_time:String?
    var mass_location:String?
    var mass_description:String?
   init(mass_id:Int,mass_date:String,
   mass_time:String,mass_location:String,mass_description:String)
  {
        self.mass_id=mass_id
        self.mass_date=mass_date
        self.mass_time=mass_time
        self.mass_location=mass_location
        self.mass_description=mass_description   
    }
}

и код, который я получаю JSON из URLSession.

    func getjson()->[MassInfoObject]? {
            let urlPath = "http://myclassinfo.com/dev/json.php"
            let url = URL(string: urlPath)
            var massObjArray = [MassInfoObject]()
            var index:Int = 0
            let task = URLSession.shared.dataTask(with: url!) { data, response, error in
                print("Task completed")

                guard data != nil && error == nil else {
                    //print(error?.localizedDescription)
                    return
                }
                do {
                    if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary {

                        for (key, value) in jsonResult {
                            //print("Value: \(value) for key: \(key)")
                            if let results = jsonResult[key] as? [String] 
      {

                                let dict = results[index].toJSON() as? [String:AnyObject] // can be any type here
                                for (key,value) in dict!{
                                    let result2 = dict![key] as! String
                                    print (result2)
                                }
                             }

                        }
                    }
                } catch let parseError as NSError {
                    print("JSON Error \(parseError.localizedDescription)")
                }
            }

            task.resume()
            return massObjArray
        }

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Спасибо Марселю и всем, кто мне помог. Вот код, который я использовал

struct MassObj:Decodable{
    var mass_id:Int
    var mass_date: String
    var mass_time:String
    var mass_location:String
    var mass_description:String
}

func getJsonArray2() {

        let urlPath = "http://myclassinfo.com/dev/json.php"
        guard let url = URL(string: urlPath) else {return }
        let task = URLSession.shared.dataTask(with: url)
        {
            data, response, error in
            print("Task completed")

            guard data != nil && error == nil else {
                //print(error?.localizedDescription)
                return
            }
            do{
                var massArray = [MassObj]()
                massArray = try JSONDecoder().decode([MassObj].self, from:data!)

                for object in massArray {
                    print("\(object.mass_id) == \(object.mass_date) == \(object.mass_description)")
                }

            }catch let jerr {
                print(jerr)
            }

        }

        task.resume()
    }

================ и JSON

[
{
    "mass_description": "Blah1", 
    "mass_date": "5/1/2019", 
    "mass_location": "", 
    "mass_time": "7:30 PM", 
    "mass_id": 7780
}, 
{
    "mass_description": "blah2", 
    "mass_date": "6/10/2019", 
    "mass_location": "1234 some place Los Angeles", 
    "mass_time": "7:30 PM", 
    "mass_id": 7781
}, 
{
    "mass_description": "blah3", 
    "mass_date": "5/21/2019", 
    "mass_location": "", 
    "mass_time": "7:30 PM", 
    "mass_id": 7783
}, 
{
    "mass_description": "blah4", 
    "mass_date": "4/5/2019", 
    "mass_location": "4050 Mission Ave, Oceanside, CA 92057", 
    "mass_time": "2:30 PM", 
    "mass_id": 1115
}
]
0 голосов
/ 24 апреля 2019

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

Следующие работы на детской площадке:

let str = """
{ "mass_info1": [{ "mass_id":7780, "mass_date":"5/1/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_description": "Blah1"
} ] ,
"mass_info2":  [ { "mass_id":7781,  "mass_date":"6/10/2019", "mass_time":"7:30 PM", "mass_location":"1234 some place Los Angeles",  "mass_description": "Blah2"
} ] ,
"mass_info3":
[ { "mass_id":7783,  "mass_date":"5/21/2019",  "mass_time":"7:30 PM",  "mass_location":"",  "mass_description": "blah3"
} ] ,
"mass_info4":
[ { "mass_id":1115,  "mass_date":"4/5/2019", "mass_time":"2:30 PM", "mass_location":"4050 Mission Ave, Oceanside, CA 92057",  "mass_description": "blah4"
} ]
}
"""

struct MassInfoObject: Codable {
    var mass_id: Int
    var mass_date: String?
    var mass_time: String?
    var mass_location: String?
    var mass_description: String?
}

let data = str.data(using: .utf8)!

let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]

let jsonArray = json!.values.map { $0 }

let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])

let decoder = JSONDecoder()
let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson)

Первые шаги - преобразовать json во что-то, что может быть легко проанализировано. Поскольку теперь MassInfoObject соответствует Codable, вы можете использовать простой JSONDecoder для декодирования массива объектов, это всего лишь одна строка кода.

Кроме того, в вашем сетевом коде вы вызываете асинхронную задачу, но вы возвращаетесь немедленно, это не сработает. Когда вы возвращаетесь из функции getJson, у вас еще нет результатов. Проще всего использовать замыкание, которое можно вызвать с результатами:

В вашем сетевом коде это будет выглядеть так:

func getjson(handler: @escaping ([MassInfoObject]?)->()) {
  let urlPath = "http://myclassinfo.com/dev/json.php"
  let url = URL(string: urlPath)
  let task = URLSession.shared.dataTask(with: url!) { data, response, error in
     print("Task completed")

     guard let data = data && error == nil else {
        //print(error?.localizedDescription)
        return
     }
     do {
        let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]
        let jsonArray = json!.values.map { $0 }
        let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])
        let decoder = JSONDecoder()
        let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson).compactMap { $0 }

        handler(items)

     } catch let parseError as NSError {
        print("JSON Error \(parseError.localizedDescription)")
        handler(nil)
     }
   }

   task.resume()
}

Если у вас есть json, который выглядит так:

[
{
    "mass_description": "Blah1", 
    "mass_date": "5/1/2019", 
    "mass_location": "", 
    "mass_time": "7:30 PM", 
    "mass_id": 7780
}, 
{
    "mass_description": "blah2", 
    "mass_date": "6/10/2019", 
    "mass_location": "1234 some place Los Angeles", 
    "mass_time": "7:30 PM", 
    "mass_id": 7781
}, 
{
    "mass_description": "blah3", 
    "mass_date": "5/21/2019", 
    "mass_location": "", 
    "mass_time": "7:30 PM", 
    "mass_id": 7783
}, 
{
    "mass_description": "blah4", 
    "mass_date": "4/5/2019", 
    "mass_location": "4050 Mission Ave, Oceanside, CA 92057", 
    "mass_time": "2:30 PM", 
    "mass_id": 1115
}
]

Вы можете легко расшифровать это:

let items = try JSONDecoder().decode([MassInfoObject].self, data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...