根据FieldNamingPolicy重命名GSON中的映射键

时间:2014-11-21 11:03:02

标签: java json gson

假设我正在构建我的GSON对象

new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();

现在我想反序列化以下JSON

{
    "MyMap" : {
        "Key1" : "Foo",
        "Key2" : "Bar"
    }
}

进入下面的课程(工作正常)

public class MapClass {
    Map<String,String> myMap;
}

但我也希望将键命名为“key1”和“key2”。我该怎么做呢?

2 个答案:

答案 0 :(得分:0)

您可以尝试这种方式:

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
    }

答案 1 :(得分:0)

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);