JSON格式不匹配异常排查:提取photo_reference失败求助
提取JSON中photo_reference字段时遭遇格式不匹配异常
我最近在处理一段JSON数据,想从中提取photo_reference字段的字符串值,结果碰到了格式不匹配异常。我反复检查自己的逻辑,觉得没问题啊——异常明明出在result处理环节,但一眼就能看到results是个对象数组!
给定的JSON数据
{ "html_attributions" : [], "results" : [ { "name" : "Rhythmboat Cruises", "photos" : [ { , "photo_reference" : "CnRnAAAAF-LjFR1ZV93eawe1cU_3QNMCNmaGkowY7CnOf-kcNmPhNnPEG9W979jOuJJ1sGr75rhD5hqKzjD8vbMbSsRnq_Ni3ZIGfY6hKWmsOf3qHKJInkm4h55lzvLAXJVc-Rr4kI9O1tmIblblUpg2oqoq8RIQRMQJhFsTr5s9haxQ07EQHxoUO0ICubVFGYfJiMUPor1GnIWb5i8", "width" : 519 } ], }, , { "name" : "Bucks Party Cruise", "photos" : [ { "photo_reference" : "CnRnAAAA48AX5MsHIMiuipON_Lgh97hPiYDFkxx_vnaZQMOcvcQwYN92o33t5RwjRpOue5R47AjfMltntoz71hto40zqo7vFyxhDuuqhAChKGRQ5mdO5jv5CKWlzi182PICiOb37PiBtiFt7lSLe1SedoyrD-xIQD8xqSOaejWejYHCN4Ye2XBoUT3q2IXJQpMkmffJiBNftv8QSwF4", "width" : 800 } ], } ] }
我的提取代码
var arr: JSONArray = JSONArray(result) var jsonObject:JSONObject=arr.getJSONObject(0) var array:JSONArray=jsonObject.getJSONArray("photos") var obj:JSONObject=array.getJSONObject(0) var photoref:String=obj.getString("photo_reference")
问题根源分析
其实你的代码逻辑本身是没问题的,但给定的JSON存在语法错误,这才是导致解析失败的核心原因:
- 第一个
photos数组里的对象开头多了个逗号:{ , "photo_reference",这个多余的逗号会直接破坏JSON的结构 results数组中,第一个对象和第二个对象之间多了个逗号:}, , {,同样属于无效的JSON语法
JSON对语法要求非常严格,这些多余的逗号会让JSON解析器无法正确解析整个数据,自然在你尝试把result转换成JSONArray时抛出格式不匹配异常。另外,你的代码还有个小疏漏:原JSON的根节点是对象而非数组,直接用JSONArray(result)解析本身也是错误的。
修正方案
先把JSON修正为合法格式:
{ "html_attributions" : [], "results" : [ { "name" : "Rhythmboat Cruises", "photos" : [ { "photo_reference" : "CnRnAAAAF-LjFR1ZV93eawe1cU_3QNMCNmaGkowY7CnOf-kcNmPhNnPEG9W979jOuJJ1sGr75rhD5hqKzjD8vbMbSsRnq_Ni3ZIGfY6hKWmsOf3qHKJInkm4h55lzvLAXJVc-Rr4kI9O1tmIblblUpg2oqoq8RIQRMQJhFsTr5s9haxQ07EQHxoUO0ICubVFGYfJiMUPor1GnIWb5i8", "width" : 519 } ] }, { "name" : "Bucks Party Cruise", "photos" : [ { "photo_reference" : "CnRnAAAA48AX5MsHIMiuipON_Lgh97hPiYDFkxx_vnaZQMOcvcQwYN92o33t5RwjRpOue5R47AjfMltntoz71hto40zqo7vFyxhDuuqhAChKGRQ5mdO5jv5CKWlzi182PICiOb37PiBtiFt7lSLe1SedoyrD-xIQD8xqSOaejWejYHCN4Ye2XBoUT3q2IXJQpMkmffJiBNftv8QSwF4", "width" : 800 } ] } ] }
再调整代码,先解析根对象再获取results数组:
var rootObj: JSONObject = JSONObject(result) var arr: JSONArray = rootObj.getJSONArray("results") var jsonObject: JSONObject = arr.getJSONObject(0) var array: JSONArray = jsonObject.getJSONArray("photos") var obj: JSONObject = array.getJSONObject(0) var photoref: String = obj.getString("photo_reference")
这样修正后,就能正常提取到photo_reference的值了。
内容的提问来源于stack exchange,提问作者Abdus Samad
相关产品推荐
相关产品推荐

