我想反序列化JSON,其中一个字段可能有多个dataType

kb5ga3dv  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(107)

我想在java中反序列化JSON主体,其中一个字段可能有多个dataType和不同的字段。
例如:
第1种变体

{
    "errorMessage": " Task timed out after 60.04 seconds"
}

第二种变体

{
    "errorType": "Runtime.ExitError",
    "errorMessage": "RequestId: xyz Error: Runtime exited with error: signal: aborted"
}

第3种变体

"errorMessage": {
        "code": 502,
        "message": "Failed to read object from S3: abcd9.json with error message: NoSuchBucket: The specified bucket does not exist"
    },
    "errorType": "Error",

我搞不清楚如何设计一个pojo或数据模型来处理这个问题和反序列化。
如果是第三种类型的JSON,我想访问类中的代码和消息。
我试图创建一个定制的Deserializer,但没有成功。

k5ifujac

k5ifujac1#

通常这些东西都有一个结构和模式,你不需要每个变体都有Pojo,但你的例子对我来说似乎很不对劲,你确定这正是你收到的吗?
通常,您的变体可以使用如下内容来涵盖。

public class ErrorRoot {
    public String errorType;
    public String errorMessage;
}

public class ErrorRoot {
    public ErrorMessage errorMessage;
    public String errorType;
}

public class ErrorMessage {
    public int code;
    public String message;
}

用途:

// Using fasterxml.jackson
ObjectMapper om = new ObjectMapper();
Root root = om.readValue(myJsonString, ErrorRoot.class);
fumotvh3

fumotvh32#

我建议将其序列化为Map<String,Object>,它总是可以工作的,但是你必须分析你的map,看看它的结构是什么。
您可以直接使用JsonJackson库,并使用类ObjectMapper来执行此操作。你也可以使用JsonUtils类,它是ObjectMapper类的一个精简 Package 器,允许你在一行中完成简单的序列化/反序列化。下面是一个例子:

try {
    Map<String, Object> myMap = JsonUtils.readObjectFromJsonString(jsonString, Map.class);
catch(IOException ioe) {
  ...
}

JsonUtils类是由我编写和维护的开源MgntUtils java库的一部分。这里是JsonUtils Javadoc,库可以作为maven artifact或从github获得(包括源代码和Javadoc)

相关问题