Как мне разобрать поле из глубоко вложенного json-объекта с помощью Gson и модифицировать его в Android? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть уникальная ситуация, когда я должен получить определенное время от глубоко вложенного объекта json. Это немного сложно, я не мог найти решение, поэтому искал идеи и способы решения этой проблемы

У меня есть JSON следующим образом:

[{
        "mySpaceId": 73220,
        "myBuildingId": 14019,
        "myFloorId": 10569,
        "myFloorNumber": "4",
        "myFloorName": "4th Floor",
        "spaceName": "My Room 4",
        "capacity": 5,
        "type": "huddle",
        "busyAt": []
    },
    {
        "mySpaceId": 73219,
        "myBuildingId": 14019,
        "myFloorId": 10569,
        "myFloorNumber": "4",
        "myFloorName": "4th Floor",
        "spaceName": "My room 5",
        "description": null,
        "capacity": 4,
        "type": "huddle",
        "timeZone": "America/New_York",

        "busyAt": [{
            "from": "2019-06-07T23:00:00+0000",
            "to": "2019-06-07T23:15:00+0000",
            "events": [{
                "id": "109142028",
                "series_id": null,
                "recurrence_id": null,
                "uid": "ABCDE",
                "space_id": 73219,
                "start": {
                    "date_time": "2019-06-07T19:00:00-0400",
                    "time_zone": "America/New_York"
                },
                "end": {
                    "date_time": "2019-06-07T19:15:00-0400",
                    "time_zone": "America/New_York"
                },
                "started_at": "2019-06-07T19:00:00-0400",
                "ended_at": "2019-06-07T19:15:00-0400"
            }]
        }]
    }
]

Я использую это: http://www.jsonschema2pojo.org/, чтобы сгенерировать класс из приведенной выше строки json. Мне было интересно, как я могу получить "start_at": "2019-06-07T19: 00: 00-0400",

из событий busyAt-> в мой основной класс модели, созданный на вышеуказанном сайте? Скажите на том же уровне, что и mySpaceId. В настоящее время я использую следующее:

 public List<BusyAt> getBusyAt() {
        return busyAt;
    }

    public void setBusyAt(List<BusyAt> busyAt) {
        this.busyAt = busyAt;
    }

Есть ли способ, с помощью которого я могу получить start_at на этом уровне и проанализировать дату и время в формате: 8:00? использовать его в моем коде.

Есть идеи, как это сделать? Спасибо! Пожалуйста, дайте мне знать, если это сбивает с толку или нужно больше разъяснений, рад выложить больше кода.

Ответы [ 3 ]

1 голос
/ 09 июня 2019

Я использую это: http://www.jsonschema2pojo.org/, чтобы сгенерировать класс из приведенной выше строки json.Мне было интересно, как я могу получить "launch_at": "2019-06-07T19: 00: 00-0400" из событий busyAt-> в мой основной класс модели, сгенерированный вышеуказанным сайтом?Скажите на том же уровне, что и mySpaceId.В настоящее время я использую следующее:

Если я правильно вас интерпретирую, вы создали с помощью www.jsonschema2pojo.org следующие классы: -

  • класс под названием "Entity"", который содержит" mySpaceId "и список" BusyAt ".
  • класс "BusyAt" содержит список "Event".
  • класс "Event" содержит строку с именем StartedAt. * ​​1014 *

Я предполагаю, что вы хотите получитьПервая запись каждого списка (если он существует) непосредственно из самого верхнего класса («Entity»)

что-то вроде: -

entity.busyAt (0) .events(0) .startedAt
, если либо busyAt, либо список событий пуст или равен нулю, тогда возвращает пустую строку для launchAt. * ​​1023 *

, что вы можете сделать, это создать следующий метод в "Entity"class (корневой класс, содержащий как mySpaceId, так и List).

public String getStartedAt(){
  //check if the busyAt List contains items or not.
  if (busyAt ==null || busyAt.isEmpty()){
    return "";
  }
  //take the list of events from the first busyAt in the array
  List<Event> eventList = busyAt.get(0).getEvents();
  //check if the event List contains items or not.
  if (eventList ==null || eventList.isEmpty()){
    return "";
  }
  //return the StartAt value of the first event.
  return eventList.get(0).getStartedAt(); 
}
0 голосов
/ 08 июня 2019

Вы можете использовать Google GSON для анализа этого JSON.Вот ссылка для Google GSON: [https://search.maven.org/artifact/com.google.code.gson/gson/2.8.5/jar].

. Это была бы лучшая альтернатива, чем создание классов.Просто нажмите на раздел «Загрузки» в правой части страницы (страница, полученная по приведенной выше ссылке) и загрузите файл Jar и исходный файл, если вы хотите выполнить отладку с использованием фактического источника.Наконец, включите их в свой проект.

Что касается кода, вот фрагмент из того, что я написал:

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.File;
import java.io.FileReader;
import java.util.logging.Logger;

public class JSONTester {

    private static File json = new File("/Users/XXXX/Production/StackOverFlow/JSON_From_https-::stackoverflow.com:questions:56501897:how-do-i-retrieve-json-from-a-deep-nested-object#56501897.json");
    private static Logger jsonLogger = Logger.getLogger(JSONTester.class.getSimpleName());


    public static void main(String[] args) {
        JsonElement jsonElement;
        try {
            jsonElement = new JsonParser().parse(new FileReader(json));
        } catch (Exception e) {
            jsonLogger.severe("There was an error parsing the JSON with message " + e.getLocalizedMessage());
            return;
        }

        if (jsonElement != null) {
            if (jsonElement instanceof JsonArray) {
                JsonArray jsonArray = (JsonArray) jsonElement;
                for (int i = 1; i < jsonArray.size(); i++) {
                    JsonElement element = jsonArray.get(i);
                    //We are considering only JSON objects inside a JSONArray.
                    if (element instanceof JsonObject) {
                        JsonObject jsonObject = (JsonObject) element;
                        if (jsonObject.has("busyAt")) {
                            JsonArray busyAtJsonArray =
                                    jsonObject.getAsJsonArray("busyAt");
                            if (busyAtJsonArray != null && busyAtJsonArray.size() >
                                    0) {
                                //You got the busyAt json array. Now, since you already know
                                //that events is another JSONArray within busyAt array, process this
                                //array accordingly. Get the first JsonObject from the events
                                //array to get "started_at" and "ended_at" fields from
                                //this (first) json object.
                                                                    //busyAt.get(0) = from,to,events[],
                                JsonObject firstJsonObject = (JsonObject) busyAtJsonArray.get(0);
                                JsonArray eventsArray = firstJsonObject.getAsJsonArray("events");
                                JsonObject eventsFirstObject = (JsonObject) eventsArray.get(0);
                                String started_At = eventsFirstObject.get("started_at").getAsString();
                                String ended_At = eventsFirstObject.get("ended_at").getAsString(); 

                            }
                        }
                    }
                }
            }
        }
    }
} 

Обратите внимание, что я был осторожен в предположенииявляется ли JsonElement JsonArray или JsonObject.Вы должны также попытаться сделать это так, чтобы, когда вы столкнетесь с какими-либо исключениями, вы знали, что вызвало это.Очевидно, вы получите исключения приведения классов (или другие, в зависимости от того, что вы делали неправильно), но это хорошая идея, чтобы отслеживать, почему это произошло.

Для получения более подробной информации просмотрите библиотеку GSON.документация (ссылка https://sites.google.com/site/gson/gson-user-guide) и способ синтаксического анализа объектов Json, массивов Json и т. д. Это наглядно объясняет преимущества использования GSON и его преимущества перед другими методами анализа JSON. Основной элемент, который вы получаете при разборе любого изэто будет JsonElement. Затем вы можете привести его к любому из вышеперечисленного в зависимости от того, что вы считаете правильным элементом (объект или массив json). Или, если вы хорошо разбираетесь в структуре JSON, вы можете просто привести егои получите результаты соответственно.

0 голосов
/ 08 июня 2019

Вам нужно будет сделать что-то вроде этого:

JSONArray array = new JSONArray(result);
for (int i = 0; i < array.length(); ++i) {
JSONObject jObj = array.getJSONObject(i);

String busyAt = jObj.getString("busyAt");
// convert it to json array 
JSONArray busyAtArray = new JSONArray(busyAt)
String endedAt = busyAtArray.getJSONObject(0).getString("ended_at")
// convert the string and get the time from it

}

Надеюсь, у вас есть общее представление об этом. Этот фрагмент, безусловно, может быть написан лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...