猿问

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

使用 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;


}




偶然的你
浏览 193回答 1
1回答

侃侃尔雅

您的注释针对 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 客户端。
随时随地看视频慕课网APP

相关分类

Java
我要回答