Json синтаксический анализ данных Codename one - PullRequest
1 голос
/ 06 мая 2020

Я получаю ответ Json от моего symfony веб-приложения.

[
{
"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» «код отслеживания»

Моя проблема в том, что я не нашел правильный способ доступа к полям «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());

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Вы прошли 99% пути:

for (Map<String, Object> obj : list) {
    // ...
    Map<String, Object> livreur = obj.get("Livreur");
    String livreurImage = (String)liverur.get("image");
    // ...
}
0 голосов
/ 06 мая 2020

У вас должен быть такой доступ.

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. Вы можете просто создать такую ​​структуру. (не забудьте добавить геттер / сеттер)

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

Надеюсь, это поможет.

...