[英]How to deserialize a nested JSON object as a String with Gson, Retrofit, Active 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.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.