我有一个如下所示的 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's User Guide 中找到信息.这不完全是手动解析,但也没什么不同,因为您必须告诉 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
类。
关于java - 使用 Gson 将单个 json 条目解析为多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17680108/