Use Swifty JSON to parse array

2019-09-13 02:21发布

问题:

This is my json to parse (example):

[
  {
    "id": 1,
    "name": "Team name",
    "shower": {
      "id": 1,
      "status": 1,
      "startLocation": {
        "id": 1,
        "name": "abc 16"
      }
    }
  },
  {
    "id": 2,
    "name": "Team name",
    "shower": {
      "id": 2,
      "status": 1,
      "startLocation": {
        "id": 1,
        "name": "efg 16"
      }
    }
  }
]
  • paste it this json viewer to view it easily.

as you can see, it is an array (of teams). I need to get each team and do something with it.

After many attempts, I tried using SwiftyJSON, because I thought it will be easier. But, it did not worked for me.

This is what I tried:

let array = JSON(response)  

// print each subJSON in array
for team in array.arrayValue {                    
  print(team)                    
}

But the loop does not work. It does not go in to the loop at all. Maybe it does not understand that my json is an array.

I can see the array object in the debugger. It looks like this:

How can I get these sub-JSONs?

Thanks.

回答1:

I think you should use

let array = JSON(parseJSON: response) 

instead of

let array = JSON(response)


回答2:

SwiftyJSON contains methods to parse JSON string into a JSON object, check documentation

/**
 Parses the JSON string into a JSON object
 - parameter json: the JSON string
 - returns: the created JSON object
*/

 public init(parseJSON jsonString: String) {
   if let data = jsonString.data(using: .utf8) {
                self.init(data)
            } else {
                self.init(NSNull())
            }        
   }       


/**
 Creates a JSON from JSON string
 - parameter string: Normal json string like '{"a":"b"}'

 - returns: The created JSON
 */
@available(*, deprecated: 3.2, message: "Use instead `init(parseJSON: )`")
public static func parse(json: String) -> JSON {
    return json.data(using: String.Encoding.utf8)
        .flatMap{ JSON(data: $0) } ?? JSON(NSNull())
}

or alternatively you can convert son string into son object like

Swift 3:

let dataFromString = response.data(using: .utf8)
let jsonArray = JSON(data: dataFromString!)


回答3:

In the following example, I save team names in an array. I've tested it.

var names = [String]()
if let array = json.array {
    for i in 0..<array.count {
        let name = array[i]["name"]
        names.append(name.stringValue)
    }
}

print(names) // ["Team name", "Team name"]


回答4:

Without SwiftyJSON

Below is the valid JSON

data.json File

[{
  "id": 1,
  "name": "Team name",
  "shower": {
        "id": 1,
        "status": 1,
        "startLocation": {
  "id": 1,
  "name": "abc 16"
        }
  }
  }, {
  "id": 2,
  "name": "Team name",
  "shower": {
        "id": 2,
        "status": 1,
        "startLocation": {
  "id": 1,
  "name": "efg 16"
        }
  }
}]

Below is the code to read your json.

if let path = Bundle.main.path(forResource: "data", ofType: "json") {
        let url = URL(fileURLWithPath: path)
        do {
            let data = try Data(contentsOf: url)
            if let jsonArray = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSArray {
                for (_, item) in jsonArray.enumerated() {
                    let itemDict = item as! NSDictionary
                    let id = itemDict["id"] as! Int
                    let name = itemDict["name"] as! String
                    let shower = itemDict["shower"] as! NSDictionary

                    let showerId = shower["id"] as! Int
                    let showerStatus = shower["status"] as! Int
                    let startLocation = shower["startLocation"] as! NSDictionary


                    let startLocationId = startLocation["id"] as! Int
                    let startLocationName = startLocation["name"] as! String

                }
            }
        } catch {
            print("Error: \(error.localizedDescription)")
        }
}


回答5:

this is what worked for me:

   // Convert JSON to Array
    func JSONToArray(_ json: String) -> Array<Any>? {
        if let data = json.data(using: String.Encoding.utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: []) as? Array
            } catch let error as NSError {
                print(error)
            }
        }
        return nil
    }

After using this function i could loop trough the sub JSONs.

Thanks.