Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据FieldNamingPolicy重命名GSON中的映射键_Java_Json_Gson - Fatal编程技术网

Java 根据FieldNamingPolicy重命名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,

假设我正在像这样构建我的GSON对象

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