Как разобрать внутреннюю строку json как вложенный класс, используя модификацию - PullRequest
1 голос
/ 10 июня 2019

Ранее я использовал модификацию с вложенными классами, но текущий API, который я пытаюсь использовать, имеет такую ​​структуру:

Тело запроса:

{
   "Id" : "a2",
   "messageCode" : 1,
   "bigNestedClass" : "{\"field1\":238,\"otherField\":246,\"ip\":\"10.255.130.154\",\"someOtherField\":15,\"Info\":1501069568}"
}

и аналогичное тело ответа.

Обратите внимание, что bigNestedClass является строкой.

Я создал разные классы pojo для запроса и ответа. Однако при создании вложенного BigNestedClass это поле заполняется как объект JSON, как и ожидалось, а не строка JSON. И у меня та же проблема с анализом ответа.

Мой вопрос: существует ли способ модернизации, позволяющий кодировать, анализировать вложенные классы как строки?

Я использую Retrofit 2.0
Я использую gson (можно изменить)

1 Ответ

1 голос
/ 12 июня 2019

С Я бы просто сделал это с 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();
...