簡體   English   中英

如何使用Gson解析深層嵌套json對象中的字段並在android中進行改造?

[英]How do I parse a field from a deep nested json object using Gson and retrofit in android?

我有一個獨特的情況,我必須從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字符串生成一個類。 我想知道如何檢索“ started_at”:“ 2019-06-07T19:00:00-0400”,

從busyAt->事件到上述網站生成的主模型類中? 說出與mySpaceId相同的級別。 我目前使用以下內容:

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

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

有什么方法可以檢索此級別的starts_at並以以下格式解析日期和時間:8:00 am? 在我的代碼中使用它。

任何想法如何去做? 謝謝! 請讓我知道這是否令人困惑或需要進一步說明,很高興發布更多代碼。

您將必須執行以下操作:

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

}

希望您從中得到一般的想法。 當然可以以更好的方式編寫此代碼段。

您可以使用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 Arrays等。使用GSON及其相對於其他JSON解析方法的優勢。 解析其中任何一個時,您獲得的基本元素將是JsonElement。 然后,您可以根據自己認為正確的元素(json對象或數組)將其轉換為以上任意一種。 或者,如果您精通JSON結構,則可以將其強制轉換並相應地獲取結果。

我用這個: http : //www.jsonschema2pojo.org/從上面的json字符串生成一個類。 我想知道如何從busyAt->事件中檢索“ started_at”:“ 2019-06-07T19:00:00-0400”到上述站點生成的主模型類中? 說出與mySpaceId相同的級別。 我目前使用以下內容:

如果我對您的解釋正確,則說明您使用www.jsonschema2pojo.org創建了以下類別:-

  • 一個名為“ Entity”的類,其中包含“ mySpaceId”和“ BusyAt”列表。
  • 類“ BusyAt”包含“事件”列表。
  • 類“ Event”包含一個名為StartedAt的字符串。

我假設您想直接從最頂層的類(“實體”)檢索每個列表的“第一”條目(如果存在)

就像是: -

entity.busyAt(0).events(0).startedAt
如果busyAt或事件列表為空或為null,則為startedAt返回空字符串。

您可以做的是在“ Entity”類(包含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(); 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM