java - 使用 Gson 将单个 json 条目解析为多个对象

标签 java json parsing 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'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/

相关文章:

java - 我的数据库中有一个整数。我正在尝试获得正确的列

java - 如何通过 Java 中的一个值获取 JSON 对象?

php - 获取特定json中的mysql结果

php - 使用php解析XML数据放入mysql数据库

mysql - 如何修复MySQL错误#1064?

西门子 CX70 上的 Java ME

java - 检测连接的蓝牙媒体设备

Java/BlackBerry 构建错误覆盖太多类

mysql - 我可以将 Laravel JSONWhere 子句与 MariaDB 10.2.16 LongText 列一起使用吗?

VBA HTML 抓取 - 来自复杂表的 '.innertext'