我正在从我的symfony网络应用中获得Json响应。
[
{
"Id": 15,
"trackingcode": "LVREF45771",
"Datecreation": {
"date": "2015-01-01 00:00:00.000000",
"timezone_type": 3,
"timezone": "Europe\/Berlin"
},
"Status": "Delivered",
"Livreur": {
"image": "d81aa404f6afd393ebf6e00bf87d4107.jpeg",
"idlivreur": 1,
"nom": "Aramex",
"prenom": "Aramex",
"adresse": "Aramex Adresse",
"numtel": 96250615,
"active": null,
"commandes": []
}
},
{
"Id": 16,
"trackingcode": null,
"Datecreation": {
"date": "2015-01-01 00:00:00.000000",
"timezone_type": 3,
"timezone": "Europe\/Berlin"
},
"Status": "Not delivered",
"Livreur": {
"image": "62d44c60a0ded39190552a7677a59bb3.jpeg",
"idlivreur": 2,
"nom": "FedEx",
"prenom": "Livraison",
"adresse": "FedEx adresse",
"numtel": 96250615,
"active": null,
"commandes": []
}
}
]
我目前正在使用CodeNameOne开发一个移动应用。 我已经成功解析了一些数据,如 "Id""trackingcode"
我的问题是,我没有找到合适的方法来访问 "Livreur "字段(image , idLivreur ...)
以下是我的解析代码
JSONParser j = new JSONParser();
Map<String, Object> tasksListJson = j.parseJSON(new CharArrayReader(jsonText.toCharArray()));
List<Map<String, Object>> list = (List<Map<String, Object>>) tasksListJson.get("root");
for (Map<String, Object> obj : list) {
Livraison livraison = new Livraison();
float id = Float.parseFloat(obj.get("Id").toString());
livraison.setIdLivraison((int) id);
if (obj.get("trackingcode") == null) {
livraison.setTrackingCode("NO TRACKING CODE");
} else {
livraison.setTrackingCode(obj.get("trackingcode").toString());
}
livraison.setStatus(obj.get("Status").toString());
你应该可以这样访问。
if (obj.get("Livreur") == null) {
Map<String, Object> data = (Map<String, Object>) obj.get("Livreur");
// now access inner fields like this.
data.get("image");
}
或者你可以利用美丽的 Jackson
库。你可以简单地创建一个这样的结构。(别忘了添加gettersetter)
class Livreur {
private String image;
// others
}
class WhateverNameYouWant {
private int id;
private String trackingcode;
// and others
private Livreur livreur;
//you can add similarly for date creation and others.
}
现在改变你的读者部分。
ObjectMapper mapper = new ObjectMapper();
List<WhateverNameYouWant> list = mapper.readValue(payload, new TypeReference<List<WhateverNameYouWant>>(){});
因为你的字段似乎是混合大小写的,所以注册不区分大小写的字段
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
而且你可以使用下面的方法来忽略不需要的字段。
@JsonIgnoreProperties(ignoreUnknown = true)
class WhateverNameYouWant { }
// similarly on other classes
希望对你有所帮助。
你有99%的方法。
for (Map<String, Object> obj : list) {
// ...
Map<String, Object> livreur = obj.get("Livreur");
String livreurImage = (String)liverur.get("image");
// ...
}