Getting invalid json when calling JSONSerialization in Swift

2407 views json
6

I am trying to access a URL and parse the json output. Printing code in utf8 formnat Code: let urlString:String = "https://developer.nrel.gov/api/.../" let pvURL = URL(string: urlString) let dataTask = URLSession.shared.dataTask(with:pvURL!) { (data, response, error) in do { let json = try JSONSerialization.jsonObject(with: data!) print(String(data: data!, encoding: .utf8)!)

        }catch let err {
            print("error: \(err.localizedDescription)")
        }
    }
    dataTask.resume()

Prints the following output. I try this json in an online json parser it fails. Gives error in the first line itself.

{"inputs":{"lat":"29.93","lon":"-95.61","system_capacity":"30.30","azimuth":"180","tilt":"40","array_type":"1","module_type":"1","losses":"10"},"errors":[],"warnings":[],"version":"1.0.1","ssc_info":{"version":45,"build":"Linux 64 bit GNU/C++ Jul  7 2015 14:24:09"},"station_info":{"lat":29.93000030517578,"lon":-95.62000274658203,"elev":41.0,"tz":-6.0,"location":"None","city":"","state":"Texas","solar_resource_file":"W9562N2993.csv","distance":964},"outputs":{"ac_monthly":[3480.57373046875,3440.078369140625,3992.6513671875,3977.071533203125,4074.91357421875,3701.75,3897.655517578125,4248.00390625,4023.283447265625,4157.29931640625,3605.156005859375,3342.12890625],"poa_monthly":[139.791015625,140.18896484375,164.8218536376953,164.47149658203125,173.2971649169922,159.90576171875,169.84793090820312,186.20114135742188,173.14492797851562,176.2291717529297,148.28318786621094,136.62326049804688],"solrad_monthly":[4.509387493133545,5.006748676300049,5.316833972930908,5.4823832511901855,5.590230941772461,5.3301920890808105,5.4789652824401855,6.00648832321167,5.77149772644043,5.684812068939209,4.94277286529541,4.407201766967773],"dc_monthly":[3644.867919921875,3606.52001953125,4179.85107421875,4158.3193359375,4252.9140625,3865.03369140625,4069.092041015625,4432.62744140625,4198.369140625,4336.99609375,3767.055419921875,3490.091064453125],"ac_annual":45940.55859375,"solrad_annual":5.293959140777588,"capacity_factor":17.308107376098633}}`

whereas if I access the urlString in a browser gives valid json:

{
"inputs": {
"lat": "29.93",
"lon": "-95.61",
"system_capacity": "30.30",
"azimuth": "180",
"tilt": "40",
"array_type": "1",
"module_type": "1",
"losses": "10"
},
"errors": [],
"warnings": [],
"version": "1.0.1",
"ssc_info": {
"version": 45,
"build": "Linux 64 bit GNU/C++ Jul  7 2015 14:24:09"
},
"station_info": {
"lat": 29.93000030517578,
"lon": -95.62000274658203,
"elev": 41,
"tz": -6,
"location": "None",
"city": "",
"state": "Texas",
"solar_resource_file": "W9562N2993.csv",
"distance": 964
},
"outputs": {
"ac_monthly": [
3480.57373046875,
3440.078369140625,
3992.6513671875,
3977.071533203125,
4074.91357421875,
3701.75,
3897.655517578125,
4248.00390625,
4023.283447265625,
4157.29931640625,
3605.156005859375,
3342.12890625
],
...
}

answered question

To get a better fix, can you print String(data: data, encoding: .utf8)! and post it here.

1 Answer

13

In your code you are converting the JSON data into an JSON object(Array, Dictionary).

But In browser the JSON data is printing as String and not as JSON object(Array, Dictionary).

So if you want to print the JSON string in your code as well, you can print as like below.

let string = String(data: self, encoding: .utf8)
print("JSON String:\(String(describing: string))")

Hope it helps.

posted this

Have an answer?

JD

Please login first before posting an answer.

Ads

Categories