为了账号安全,请及时绑定邮箱和手机立即绑定

从 json 到包含枚举的对象的反序列化问题

从 json 到包含枚举的对象的反序列化问题

偶然的你 2023-04-26 17:12:13
使用 jackson2.9.8 进行枚举反序列化时出现问题。同样适用于 Gson。模型是从 swagger api 定义自动生成的使用 Gson,它工作正常。对于 jackson,它不适用于 011、013 和 019,但适用于其他值Swagger API 定义的片段服务代码:类型:字符串枚举:-“001”-“002”-“003”-“004”-“005”-“007”-“008”-“009”-“011”-“013”-“019” “自动生成的代码(为了可读性删除了 getter/setter)public class ProcessErrorTest1 {    static String errorJson =            "    {\n" +            "      \"timestamp\": \"2019-07-29 11:55:48\",\n" +            "      \"serviceCode\": \"019\",\n" +            "      \"message\": \"service failed. \",\n" +            "      \"rootException\": {\n" +            "        \"source\": \"test\",\n" +            "        \"reasonCode\": \"2131\",\n" +            "        \"reasonText\": \"test\"\n" +            "      }\n" +            "}";    public static void main(String[] args) throws Exception {        ObjectMapper mapper = new ObjectMapper();        AppErrorResponse error = mapper.readValue(errorJson, AppErrorResponse.class);       // Gson gson = new Gson();        //AppErrorResponse error = gson.fromJson(errorJson, AppErrorResponse.class);        System.out.println("error::" + error);    }}public class AppErrorResponse {  @SerializedName("message")  private String message = null;  @SerializedName("rootException")  private ErrorResponse rootException = null;  /**   * Gets or Sets serviceCode   */  @JsonAdapter(ServiceCodeEnum.Adapter.class)  public enum ServiceCodeEnum {    _001("001"),    _002("002"),    _003("003"),     _004("004"),    _005("005"),    _007("007"),    _008("008"),    _009("009"),    _011("011"),    _013("013"),   // @JsonProperty("019") if add this , it works fine. But can't modify the auto generated code as it is available as jar    _019("019");  }  @SerializedName("serviceCode")  private ServiceCodeEnum serviceCode = null;  @SerializedName("timestamp")  private String timestamp = null;}
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

您的注释针对 Gson 而不是 Jackson,您应该为 Jackson 而不是 Gson 生成 pojo。该行@JsonAdapter(ServiceCodeEnum.Adapter.class)是一个适配器,它处理 Gson 的枚举转换。

那里说:For all the unspecified options default values will be used.

使用上面列出的下表:

CONFIG OPTIONS

    modelPackage

        package for generated models


    apiPackage

        package for generated api classes

...... (results omitted)

    library

        library template (sub-template) to use:

        jersey1 - HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2

        jersey2 - HTTP client: Jersey client 2.6

        feign - HTTP client: Netflix Feign 8.1.1.  JSON processing: Jackson 2.6.3

        okhttp-gson (default) - HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1

        retrofit - HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0)

        retrofit2 - HTTP client: OkHttp 2.5.0. JSON processing: Gson 2.4 (Retrofit 2.0.0-beta2)

        google-api-client - HTTP client: google-api-client 1.23.0. JSON processing: Jackson 2.8.9

        rest-assured - HTTP client: rest-assured : 3.1.0. JSON processing: Gson 2.6.1. Only for Java8

这条线可能是什么被使用:


okhttp-gson (default) - HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1


您需要指定一个使用 Jackson 的库和您想要的 HTTP 客户端。


查看完整回答
反对 回复 2023-04-26
  • 1 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信