Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson-反序列化未知类_Java_Json_Gson - Fatal编程技术网

Java Gson-反序列化未知类

Java Gson-反序列化未知类,java,json,gson,Java,Json,Gson,假设我有一组a、B、C类: 公共A类: 整数 B类公众: 整数; 字符串地址 公共C类: int订单号 如何反序列化仅包含这些类但顺序未知的Json字符串(在Java中使用Gson)?例如: {//A "number" : 3 } //C { "orderNumber": 10 } //B { "number" : 5 "address" : "New York" } //C { "orderNumber": 1 } 多谢各位 如果您有更复杂的类和更多的字段,那么这不是一个通用的策略,或者无论

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

公共A类: 整数

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

公共C类: int订单号

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

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

多谢各位

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

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

@Getter
public class Z {
   private Integer orderNumber;
   private Integer number;
   private String address;
}
您将获得一个
Z
s列表,根据字段中的
null
或非
null
您可以(如果需要)稍后从
Z
构建
a
B
C

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

Collection<Map<String,String>>
收藏

因此,对于每个项目,您需要通过映射中存在哪些字段来确定哪些类-
A
B
C
,项目将被构造。

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);

我认为您应该首先将json负载转换为一个通用结构(如Jackson中的JsonNode),然后决定将其转换为哪个类