当前位置: 首页 > 面试题库 >

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

邢飞鸿
2023-03-14
问题内容

我有一个看起来像这样的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理解它的方法是通过TypeAdapter为您的Test类创建一个自定义反序列化器。您可以在《
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类。



 类似资料:
  • 问题内容: 我的样子如下: 现在,每个元素具有相同的结构(假设一个POJO称为MessageDefault.java)。那么我怎么能把所有东西都当作一个??呢? 我正在使用gson进行解析。我也不能更改JSON响应。 编辑:: MessageDefault.java 它只是一切的结构。但是在JSON中,的每个子项都有不同的名称,例如POJO MessageDefault.java中所反映的名称。但

  • 这里是我被困的地方,我在哪里创建我的新Gson()来在发送数据之前解析它?

  • 问题内容: 我想使用google-gson将json数据解析为java对象。 这是我要解析的数据的示例: IsBean.java User.java RequestObj.java Test.java 错误: 问题答案: 如果没有看到的代码,我不能肯定的说,但是我很有把握地猜测该类有一个类型的字段,您可以使用它来容纳。如果是这样,那么问题在于GSON会扫描该类对象的字段,并且基于字段定义,必须创建

  • 问题内容: 我有一个名为包含以下内容: 我知道我可以用以下方法获得阵列: 现在我想将其解析为… 最简单的方法是什么? 问题答案: 绝对最简单的方法是使用Gson的默认解析功能。 此功能的实现适用于需要反序列化为任何(例如any )的情况。 在您的情况下,您只需要获取的,然后将JSON数组解析为that ,如下所示: 在您的情况下是a ,但也可能是a ,any 或a 。 您可能需要看一下Gson A

  • 问题内容: 我有一个像这样的JSON对象: 并尝试与Gson解析: 但是“ responceBean”始终为“ null” 这是所有其他类: 这是我的最新尝试。我不知何故找不到正确的方法。任何帮助将不胜感激。 问题答案: 您的 JSON模型与您的对象模型不匹配 。 您需要一个中间层来填补空白: TypeAdapter 。 而且,没有用户的命名信息。 最后是名称不匹配:JSON中的“ worklog

  • 我正在尝试将JSON转换为GSON,我不确定这是最好的结构。 所有响应都由代码、消息和数据结构组成。但数据的内部结构可能会有所不同。 这是我的回应对象