Динамическое чтение вложенных свойств хэш-карты - PullRequest
2 голосов
/ 06 августа 2020

У меня есть JSON ниже:

"total":"2",
"offset":"1",
"limit":"2",
"results":[{    
    "code":1,
    "title":"RESTAURANTE SADOCHE",
    "contact":{
        "code":10,
        "name":"HENRIQUE BARBALHO",
        "company":{
            "code":100,
            "name":"RESTAURANTE SADOCHE LTDA-ME"
        }
    }
},
{
    "code":2,
    "title":"ARNALDO GRILL",
    "contact":{
        "code":20,
        "name":"FÁTIMA COSTA",
        "company":{
            "code":200,
            "name":"COSTA NATAL RESTAURANTE EIRELI"
        }
    }
}]

Я превратил этот JSON в Java HashMap с помощью библиотеки Gson.

Map<String, Object> retMap = new Gson().fromJson(jsonUpString, new TypeToken<HashMap<String, Object>>(){}.getType());

Мне нужно динамически прочтите некоторые свойства созданной хэш-карты. Пример: заголовок, имя контакта и имя компании.

Иногда эти свойства (заголовок, имя контакта и имя компании) могут быть внутри списков.

Ниже моего кода:

String propertyName = "name";
String nesting = "results;contact;company";
String[] levels = nesting.split(";");

Map map = new HashMap();
map = retMap;

for (int i = 0; i < niveis.length; i++) {                        
    map = (Map)map.get(levels[i]);        
    System.out.println(map);

    if (i == levels.length - 1) {
        System.out.println(map.get(propertyName));
    }
}

Но если свойства (результаты, контакт или компания) возвращают более одного объекта, JSON возвращает их в виде списков, и я не могу получить нужную мне информацию.

1 Ответ

0 голосов
/ 28 августа 2020

Я решил проблему с помощью ...

private static void leJSON(Object object) {
    if (object instanceof JSONObject) {
        Set < String > ks = ((JSONObject) object).keySet();
        for (String key: ks) {
            Object value = ((JSONObject) object).get(key);
            if (value != null) {
                System.out.printf("%s=%s (%s)\n", key, value, value.getClass().getSimpleName());
                if (value.getClass().getSimpleName().equalsIgnoreCase("JSONArray")) {
                    JSONArray ja = (JSONArray) value;
                    for (int i = 0; i < ja.size(); i++) {
                        leJSON(ja.get(i));
                    }
                }
                if (value.getClass().getSimpleName().equalsIgnoreCase("JSONObject")) {
                    leJSON(value);
                }
            }
        }
    }
}

основного метода ...

String json = "{...}";
JSONObject object = (JSONObject) JSONValue.parse(jsonString2);        
readJSON(object);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...