Java 根据FieldNamingPolicy重命名GSON中的映射键
假设我正在像这样构建我的GSON对象Java 根据FieldNamingPolicy重命名GSON中的映射键,java,json,gson,Java,Json,Gson,假设我正在像这样构建我的GSON对象 new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create(); 现在我想反序列化下面的JSON { "MyMap" : { "Key1" : "Foo", "Key2" : "Bar" } } 进入下一节课,这节课很好 public class MapClass { Map<String,
new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
现在我想反序列化下面的JSON
{
"MyMap" : {
"Key1" : "Foo",
"Key2" : "Bar"
}
}
进入下一节课,这节课很好
public class MapClass {
Map<String,String> myMap;
}
但是我也希望这些键被命名为key1和key2。我该怎么做呢?您可以这样尝试:
try {
JSONObject jObj = new JSONObject("{"
+ " \"MyMap\" : {"
+ " \"Key1\" : \"Foo\","
+ " \"Key2\" : \"Bar\""
+ " }"
+ "}"); // this parses the json
JSONObject jObjt = jObj.getJSONObject("MyMap");
//old version with out GSON
Map<String, String> map = new HashMap();
Iterator itr = jObjt.keys();
while (itr.hasNext()) {
String key = (String) itr.next();
String value = jObjt.getString(key);
map.put(key, value);
}
//desalinized one with GSON
Map<String, String> map1 = new Gson().fromJson(jObjt.toString(), HashMap.class);
for (String str : map1.keySet()) {
System.out.println("k:" + str + " v:" + map1.get(str));
}
} catch (JSONException ex) {
//log the error
}
FieldNamingPolicy应用于json值的字段。对于json上有键、值对的映射,不可能将此应用于映射的键 简易解决方案: 反序列化后,在映射上迭代并重命名键名。i、 e.键1至键1和键2至键2 其他解决方案: 编写一个自定义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!");
}
}
如果我用手做的话,我就不需要使用GSON了。此外,数据将是动态结构化的。您可以将其淡化为以下映射:HashMap Map=new Gson.fromJsonjObjt.toString,HashMap.class;我只是编辑我的代码。为什么不在反序列化后迭代myMap并用Key2替换Key1到Key1和Key2?这显然是一种方法。但是我在整个项目中都使用GSON对象,并且希望它能够自动执行。FieldNamingPolicy应用于字段。hashmap值不是fiedls,因此FieldNamingPolicy.UPPER\u CAMEL\u大小写仅应用于MyMap是正常的。无论如何,您可以编写自定义TypeAdapter并管理序列化-反序列化过程。重命名地图的键将更容易做到这一点。
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);