当前位置: 首页 > 知识库问答 >
问题:

gson-反序列化未知类

王子明
2023-03-14

假设我有一组a、B、C类:

公开A类:整数;

公共B类:整数;字符串地址;

公共类C:int orderNumber;

如何反序列化仅包含这些类但顺序未知的Json字符串(在Java中使用Gson)?例如:

{//A
"number" : 3
}
//C
{
"orderNumber": 10
}
//B
{
"number" : 5
"address" : "New York"
}
//C
{
"orderNumber": 1
}

非常感谢你!

共有2个答案

楚健
2023-03-14

如果您有更复杂的类和更多的字段,这不是一个通用的策略,或者无论如何是一个很好的策略。

但是,如果要反序列化的类与示例中提供的类一样简单,那么创建一个包含所有这些字段的类

@Getter
public class Z {
   private Integer orderNumber;
   private Integer number;
   private String address;
}

您将获得一个Zs列表,根据字段中的null或非null您可以(如果需要)稍后从Z构建aBC

如果要反序列化的类更复杂,您无论如何都需要创建某种机制来确定要解析和返回的类是什么。这可能就像用户1516873在评论中建议的那样

Collection<Map<String,String>>

因此,对于每个项目,您需要通过该映射中存在哪些字段来确定将构建哪些类-ABC——项目。

澹台昆
2023-03-14

pirho的答案是干净和简单的,如果像他说的,你们的课程像你们提供的那个样简单。但如果不是这样,您可以编写自己的反序列化程序。

public class PayloadJsonDeserializer implements JsonDeserializer {
    @Override
    public Object deserialize(JsonElement elm, Type type, JsonDeserializationContext context) throws JsonParseException {
        // create java objects based on the properties in the json object
        JsonPrimitive orderNumber = elm.getAsJsonObject().getAsJsonPrimitive("orderNumber");
        if(!orderNumber.isJsonNull()) {
            return new C(orderNumber.getAsInt());
        }

        return null;
    }
}

向Gson注册您的自定义反序列化程序。

GsonBuilder gsonBuilder = new GsonBuilder()
                    .registerTypeAdapter(PayloadJson.class, new PayloadJsonDeserializer());
Gson gson = gsonBuilder.create();

使用它来反序列化json。

gson.fromJson(jsonString, PayloadJson[].class);
 类似资料:
  • 问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson

  • 问题内容: 由于要执行处理的业务逻辑,因此我正在实现自定义。但是某些部分可以解析为标准方式。这是否可能- 我自己处理一些元素,并让一些嵌套元素自动处理? 这是JSON: 这是项的自定义反序列化器: 现在,我想让GSON解析枚举。我可以自己完成,这只是几行代码,但是我更愿意库做很多。 问题答案: …但是我希望图书馆尽其所能。 好吧,只需使用Gson。 有数据传输对象模式,尤其是Gson映射类,可以完

  • json如下所示: 我读了20多个答案,但找不到如何反序列化这样一个结构,请帮助我了解这个课程是什么样的,因为小时不是一个固定的字符串。

  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。

  • 问题内容: 我使用了很多不可变的集合,并且很好奇如何使用Gson反序列化它们。由于没有人回答,而且我自己找到了解决方案,因此我正在简化问题并提出自己的答案。 我有两个问题: 如何为所有人编写一个作品? 如何全部注册? 问题答案: 更新:有https://github.com/acebaggins/gson- serializers ,其中涵盖了许多番石榴集合: 如何编写适用于所有Immutable