Так как я не нашел решения для своей проблемы в сети, я реализовал адаптер для библиотеки GSON для обработки таких данных.
Как известно, JSON поддерживает только строковые ключи.Если a имеет данные в формате json, подобные этим {"a": "alpha", "2": "two", "3": 3} , я могу преобразовать их в обычный объект JSONObject, но все же могуне конвертируйте это в мой собственный Java-объект.Чтобы справиться с этой ситуацией, я создал объект ObjectMap
// ObjectMap.java
import java.util.Map;
public class ObjectMap<V> {
private Map<String, V> map;
public ObjectMap(Map<String, V> map) {
setMap(map);
}
public Map<String, V> getMap() {
return map;
}
public void setMap(Map<String, V> map) {
this.map = map;
}
@Override
public String toString() {
return "ObjectMap [map=" + map + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((map == null) ? 0 : map.hashCode());
return result;
}
@SuppressWarnings("rawtypes")
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ObjectMap other = (ObjectMap) obj;
if (map == null) {
if (other.map != null)
return false;
} else if (!map.equals(other.map))
return false;
return true;
}
}
и адаптер gson для него ObjectMapAdapter.
//ObjectMapAdapter.java
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.internal.$Gson$Types;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
public class ObjectMapAdapter<V> extends TypeAdapter<ObjectMap<V>> {
public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() {
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> TypeAdapter create(Gson gson, TypeToken<T> typeToken) {
Type type = typeToken.getType();
Class<? super T> rawType = typeToken.getRawType();
if (!ObjectMap.class.isAssignableFrom(rawType)) {
return null;
}
// if (rawType != ObjectMap.class) {
// return null;
// }
Type componentType;
if (type instanceof ParameterizedType) {
componentType = ((ParameterizedType) type).getActualTypeArguments()[0];
} else {
componentType = Object.class;
}
TypeAdapter<?> componentTypeAdapter = gson.getAdapter(TypeToken.get(componentType));
return new ObjectMapAdapter(gson, componentTypeAdapter, $Gson$Types.getRawType(componentType));
}
};
// private final Class<V> valueType;
private final TypeAdapter<V> valueTypeAdapter;
public ObjectMapAdapter(Gson context, TypeAdapter<V> componentTypeAdapter, Class<V> componentType) {
this.valueTypeAdapter = new TypeAdapterRuntimeTypeWrapper<V>(context, componentTypeAdapter, componentType);
// this.valueType = componentType;
}
public ObjectMap<V> read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
Map<String, V> map = new LinkedHashMap<String, V>();
in.beginObject();
while (in.hasNext()) {
String key = in.nextName();
V comp = valueTypeAdapter.read(in);
map.put(key, comp);
}
in.endObject();
return new ObjectMap<V>(map);
}
@Override
public void write(JsonWriter out, ObjectMap<V> map) throws IOException {
if (map == null) {
out.nullValue();
return;
}
out.beginObject();
for (Entry<String, V> entry : map.getMap().entrySet()) {
out.name(entry.getKey());
valueTypeAdapter.write(out, entry.getValue());
}
out.endObject();
}
}
Создайте собственный построитель GSON и зарегистрируйте эту фабрику
gsonBuilder.registerTypeAdapterFactory(ObjectMapAdapter.FACTORY);
если вы готовы декодировать данные, подобные этой
{"a": "alpha", "2": "two", "3":3}
в карту
ObjectMap [map={a=alpha, 2=two, 3=3}]