如何使用改造将内部json字符串解析为嵌套类

时间:2019-06-10 11:27:34

标签: java jackson gson retrofit moshi

我以前对嵌套类使用过改造,但是我正在尝试使用的当前api具有这样的结构:

请求正文:

 new Flexmonster({
  container: "#pivot-container",
  componentFolder: "https://cdn.flexmonster.com/",
  report: {
    dataSource: {
  dataSourceType: "json",
  data: [
  {Country:'USA',description:'discription'}, // description in small
  {Country:'India',description:'DISCRIPTION'}, // description in capital
  {Country:'BLA',description:'dIsCrIPtiOn'}, // description mixed
  ]
 },
 options: {
   grid: {
     type: "flat"
  },
   configuratorActive: false
 },
 slice: {
    columns: [{
     uniqueName: "Country"
  },
   {
     uniqueName: "description"
  }
  ]
  }
 },
  width: "100%",
  height: 370
});

和类似的响应主体。

请注意bigNestedClass是一个字符串。

我为请求和响应创建了不同的pojo类。但是,创建嵌套的BigNestedClass会使此字段填充为JSON对象(如预期的那样),而不是JSON字符串。我在解析响应时也遇到了同样的问题。

我的问题:改造中是否有一种方法可以将嵌套类编码,解析为字符串?

我使用Retrofit 2.0
我使用gson(可以更改)

1 个答案:

答案 0 :(得分:1)

使用,我可以简单地使用TypeAdapter。参见下面的课程:

public class MyTypeAdapter extends TypeAdapter<BigNestedClass> {

    private Gson gson = new Gson();

    @Override
    public BigNestedClass read(JsonReader arg0) throws IOException {
        // Get the string value and do kind of nested deserializing to an instance of
        // BigNestedClass
        return gson.fromJson(arg0.nextString(), BigNestedClass.class);
    }

    @Override
    public void write(JsonWriter arg0, BigNestedClass arg1) throws IOException {
        // Get the instance value and insted of normal serializing make the written
        // value to be a string having escaped json
        arg0.value(gson.toJson(arg1));
    }

}

然后,您只需向注册MyTypeAdapter,例如:

private Gson gson = new GsonBuilder()
    .registerTypeAdapter(BigNestedClass.class, new MyTypeAdapter())
    .create();

要使用,您需要在创建它时做一些事情:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.example.com")
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();