[英]Parsing single json entry to multiple objects with Gson
我有一個json響應,看起來像這樣:
{
"id":"001",
"name":"Name",
"param_distance":"10",
"param_sampling":"2"
}
我有兩個類:Teste和Parameters
public class Test {
private int id;
private String name;
private Parameters params;
}
public class Parameters {
private double distance;
private int sampling;
}
我的問題是:有沒有辦法讓Gson理解一些json屬性應該轉到Parameters類,或者唯一的方法是“手動”解析它?
好吧,只是為了讓我在@ MikO的答案中的評論更具可讀性:
我將向json輸出添加一個對象列表,因此json響應應如下所示:
{
"id":"001",
"name":"Name",
"param_distance":"10",
"param_sampling":"2",
"events":[
{
"id":"01",
"value":"22.5"
},
{
"id":"02",
"value":"31.0"
}
]
}
Deserializer類看起來像這樣:
public class TestDeserializer implements JsonDeserializer<Test> {
@Override
public Test deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
Test test = new Test();
test.setId(obj.get("id").getAsInt());
test.setName(obj.get("name").getAsString());
Parameters params = new Parameters();
params.setDistance(obj.get("param_distance").getAsDouble());
params.setSampling(obj.get("param_sampling").getAsInt());
test.setParameters(params);
Gson eventGson = new Gson();
Type eventsType = new TypeToken<List<Event>>(){}.getType();
List<Event> eventList = eventGson.fromJson(obj.get("events"), eventsType);
test.setEvents(eventList);
return test;
}
}
並做:
GsonBuilder gBuilder = new GsonBuilder();
gBuilder.registerTypeAdapter(Test.class, new TestDeserializer());
Gson gson = gBuilder.create();
Test test = gson.fromJson(reader, Test.class);
以我想要的方式給我測試對象。
讓Gson理解它的方法是通過為Test
類創建一個TypeAdapter
來編寫自定義反序列化器。 您可以在Gson的用戶指南中找到相關信息。 它不完全是手動解析 ,但它沒有那么不同,因為你必須告訴Gson如何處理每個JSON值...
它應該是這樣的:
private class TestDeserializer implements JsonDeserializer<Test> {
public Test deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
int id = obj.get("id").getAsInt();
String name = obj.get("name").getAsString();
double distance = obj.get("param_distance").getAsDouble();
int sampling = obj.get("param_sampling").getAsInt();
//assuming you have suitable constructors...
Test test = new Test(id, name, new Parameters(distance, sampling));
return test;
}
}
然后你必須注冊TypeAdapter
:
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Test.class, new TestDeserializer());
最后你必須像往常一樣解析你的JSON:
gson.fromJson(yourJsonString, Test.class);
Gson將自動使用您的自定義反序列化器將您的JSON解析為您的Test
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.