FieldNamingPolicy
применяется к полям значения JSon. Невозможно применить это к ключам карт (карте с ключами, парами значений) в json.
Простое решение: После десериализации, перейдите по карте и переименуйте имена ключей. то есть Key1 - key1 и Key2 - key2.
Другое решение:
Написать собственный TypeAdapter, который обрабатывает процесс десериализации и переименовывает ключи.
public class MapClassTypeAdapter extends TypeAdapter<MapClass> {
@Override
public MapClass read(JsonReader in) throws IOException {
final MapClass mapClassInstance = new MapClass();
mapClassInstance.myMap = new HashMap<String, String>();
in.beginObject();
if("myMap".equalsIgnoreCase(in.nextName())) {
in.beginObject();
while (in.hasNext()) {
String key = in.nextName();
// You want keys as camel case
String newKey = key.substring(0,1).toLowerCase() + key.substring(1);
String value = in.nextString();
mapClassInstance.myMap.put(newKey, value);
}
in.endObject();
}
in.endObject();
return mapClassInstance;
}
@Override
public void write(JsonWriter out, MapClass mapClass) throws IOException {
throw new RuntimeException("MapClassTypeAdapter.write method not implemented yet!");
}
}
испытания Другое решение:
String json = "{\"myMap\":{\"Key1\":\"Foo\",\"Key2\":\"Bar\"}}";
final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MapClass.class, new MapClassTypeAdapter());
final Gson gson = gsonBuilder.create();
MapClass mapClass = gson.fromJson(json, MapClass.class);
Почему вы не перебирать MyMap карты после десериализации и заменить Key1 на ключом1 и Key2 с key2? – Devrim
Это, очевидно, один из способов. Но я использую объект GSON во всем проекте и хотел бы иметь его автоматически. –
Поле FieldNamingPolicy применяется к полям. Значения hashmap не являются fiedls, поэтому это нормально, что FieldNamingPolicy.UPPER_CAMEL_CASE применяется только к MyMap. В любом случае, вы можете написать настраиваемый TypeAdapter и управлять процессом десериализации сериализации. (переименование ключей карты было бы намного легче.) – Devrim