Как преобразовать динамический вложенный JSON в объект JAVA в Android с GSON? - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь отобразить следующий JSON для моего RecyclerView и выполнить соответствующее действие.Теперь проблема в том, как я могу получить доступ к каждому ключу из объекта JSON и значений внутри ключей.Нужно ли хранить их в объектах Java с помощью POJO или Array?Я получаю следующий ответ от сервера, поэтому я не хочу хранить их статически, я хочу хранить их динамически.

Я искал решение для того же, но большинство из них включают JSONArray, и мой ответ не включает JSONArray.Он включает ключ и JSONObject в качестве значения.Я также не знаю Java, я webdev, я искал его в течение дня.

{
"response": {
    "status": 200,
    "result": {
        "17": {
            "key1": "3",
            "key2": "111111",
            "key3": "aaa",
            "key4": "sss",
            "key5": "aaa@asd.com",
            "key6": "1122334455",
            "key7": "2017-12-11",
            "key7": "something",
            "key9": "location"
        },
        "18": {
            "key1": "3",
            "key2": "111111",
            "key3": "aaa",
            "key4": "sss",
            "key5": "aaa@asd.com",
            "key6": "1122334455",
            "key7": "2017-12-11",
            "key7": "something",
            "key9": "location"
        },
        "19": {
            "key1": "3",
            "key2": "111111",
            "key3": "aaa",
            "key4": "sss",
            "key5": "aaa@asd.com",
            "key6": "1122334455",
            "key7": "2017-12-11",
            "key7": "something",
            "key9": "location"
        }
    }
  }
}

У меня есть Result JSONObject в строке,

  public void onResponse(JSONObject response) {
                String status = null;
                try {
                    JSONObject responseCode = response.getJSONObject("response");
                    status = responseCode.getString("result");
                    //Todo

                } catch (JSONException e) {
                    e.printStackTrace();
                    defaultView.setText("Json Error");
                }

                defaultView.setText(status);

            }

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

У вас есть ответ объекта результата с несколькими значениями объекта.
Таким образом, вы можете просто применить логику, например,

JSONObject responseCode = response.getJSONObject("response");  
JSONObject resultCode = responseCode.getJSONObject("result");

    if(resultCode.length >0){
        for(int i=0;i<resultCode;i++){
            JSONObject listCode = resultCode.getJSONObject(i);
            String keyVal_1=listCode.getString("key1");
//store keyVal_1 in your arrayList and other keys 
//it will work till the dynamically generated last object you store.
        }
    }
0 голосов
/ 23 декабря 2018

Во-первых, я предполагаю, что ваш пример "key7": "something" на самом деле должен быть "key8..".

Gson может проанализировать любой допустимый JSON в LinkedTreeMap, который вы затем можете зациклить любым удобным вам способом.Тем не менее, ваш ответ в некоторой степени выглядит статичным, поэтому вы можете создать DTO, чтобы облегчить доступ к значениям.Это DTO может выглядеть следующим образом:

@Getter
public class ResponseWrapper {
    @Getter
    public static class Response {
        private Integer status;
        private Map<Integer, Map<String, Object>> result;       
    }
    private Response response;
}

С этим видом DTO вы можете выполнить пример foo (и при условии отсутствия Java8 и потоков):

Response rw = new Gson().fromJson(RESPONSE_JSON, ResponseWrapper.class).getResponse();
Set<Entry<Integer, Map<String, Object>>> entries = rw.getResult().entrySet();
for(Entry<Integer, Map<String, Object>> e : entries) {
    Object o = e.getValue().get("key1");
    // do somethigs
}

Если ключи результата вашего примера(17,18,19) содержат фиксированный набор ключей - то есть, просто от key1 до key9 с теми же типами данных - вы также можете создать отдельный DTO для этого, например:

@Getter
public class ResultItem {
    private Long key1;
    private Long key2;
    private String key3;
    private String key4;
    private String key5;
    private Long key6;
    private Date key7;
    private String key8;
    private String key9;
}

и затем вашдоступ к значениям может быть более безопасным, например:

for(Entry<Integer, ResultItem> e : entries) {
    Long longKey1 = e.getValue().getKey1();
    // do somethings
}
0 голосов
/ 23 декабря 2018

в начале вы можете создать свои POJO, этот сайт для создания POJO JsonToPojoLink

тогда вы можете использовать GSON следующим образом:

   Gson gson = new Gson();
    ResponsePOJO responsePOJO;
    responsePOJO= gson.fromJson(response.toString(),ResponsePOJO.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...