Как я могу десериализовать объект JSON, но сохранить определенное поле в виде строки вместо вложенного объекта?

У меня есть структура json, которую я вставил ниже. Я хотел бы десериализовать json в java POJO, используя Gson, что довольно просто, за исключением того, что я хочу сохранить одно из полей, data, как строковый тип вместо вложенного объекта.

Структура JSON

{
  "created_on": "2015-06-04T16:12:04-0700",
  "modified_on": "2015-06-04T16:12:09-0700",
  "identifier": "sample",
  "name": "some name",
  "summary": "some summary",
  "data": {
    "$type": "a_type",
    "some_other_stuff": {
        "more_stuff": "lorem ipsum"
    },
    "type2": {
        "$type": "another_type",
        "other_stuff": {
            "event_more_stuff": "lorem ipsum"
        }
    }
  }
}

Мой POJO будет выглядеть следующим образом:

public class Sample {
  private String identifier; // "sample"
  private String created_on; // "2015-06-04T16:12:04-0700"
  private String modified_on; // "2015-06-04T16:12:09-0700"
  private String name; // "some name"
  private String summary; // "some summary"
  private String data; // "{ \"$type\": ... }"

  // getters and setters
}

Поле data должно оставаться в виде строки в формате JSON. . [+1112]

Я пытался реализовать пользовательский TypeAdapter и читать поле как строку, но это не сработало с Expected a string but was BEGIN_OBJECT.

Также обратите внимание, я хотел бы, чтобы структура поддерживалась и при сериализации - чтобы я мог сериализовать POJO обратно в исходную структуру JSON.

Редактировать Пользовательский TypeAdapter:

public class SampleTypeAdapter extends TypeAdapter<Sample> {
@Override
public void write(JsonWriter out, Sample sample) throws IOException {
    out.beginObject();

    out.name("identifier").value(sample.getIdentifier());
    out.name("name").value(sample.getName());
    out.name("data").value(sample.getData());
    out.name("summary").value(sample.getSummary());
    out.name("modified_on").value(sample.getModifiedOn());
    out.name("created_on").value(sample.getCreatedOn());

    out.endObject();
}

@Override
public Sample read(JsonReader in) throws IOException {
    final Sample sample = new Sample();

    in.beginObject();
    while (in.hasNext()) {
        String nextName = in.nextName();
        switch (nextName) {
            case "identifier":
                sample.setIdentifier(in.nextString());
                break;
            case "name":
                sample.setName(in.nextString());
                break;
            case "data":
                sample.setData(in.nextString()); // <-- fails here
                break;
            case "summary":
                sample.setSummary(in.nextString());
                break;
            case "modified_on":
                sample.setModifiedOn(in.nextString());
                break;
            case "created_on":
                sample.setCreatedOn(in.nextString());
                break;
            default:
                in.skipValue();
                break;
        }
    }
    in.endObject();

    return sample;
}
}
10
задан howettl 9 June 2015 в 20:14
поделиться