Java:Gson更改属性名称而不进行序列化

时间:2015-10-06 13:03:02

标签: java json gson

是否可以在不使用Gson进行序列化的情况下更改Json属性的名称?例如,给定这个Json

{
   "1": {
      ...
   },
   "2": {
      ...
   }
}

我可以将"1"更改为"3"而不删除其内容。我知道addProperty方法添加了一个新属性,或用新值覆盖现有属性,但我想更改属性的名称而不影响其值。另外,将现有值粘贴为addProperty的第二个参数是不够的。

编辑:要添加更多上下文,我将解释更大的图片。我有一个长达几千行的JSON字符串。我正在编写一个利用Gson的程序来更改该JSON字符串中的值。我不仅要更改属性的值,还要更改属性本身的名称。到目前为止,我已经做了所有事情而没有序列化。

以下是我写的Java的片段:

String file = "\\temp.json";

FileReader reader = new FileReader(file);

JsonStreamParser parser = new JsonStreamParser(reader);
// Parse entire JSON
JsonElement element = parser.next();
// Get root element
JsonObject sites = element.getAsJsonObject();
// Get first child element
JsonObject site1 = sites.getAsJsonObject("1");

JsonObject clust1 = site1.getAsJsonObject("CLUST");

for(int i = 1; i < 12; i++) {
    // "Dynamic" variable        
    String num = Integer.toString(i);
    // Get property whose name is a number, has siblings
    JsonObject one = custCluster1.getAsJsonObject(num);

    one.getAsJsonObject().addProperty("name", "cluster" + i);

    JsonObject subOne = one.getAsJsonObject("SUB");

    subOne.getAsJsonObject().addProperty("name", "aName" + i);

    for(int n = 1; n < 1002; n++) {
        // "Dynamic" variable
        String inst = Integer.toString(n);
        // Get property whose name is a number, has siblings
        JsonObject subSub = subOne.getAsJsonObject(inst);
        // If the property doesn't exist, then don't execute
        if(subSub != null) {

            JsonArray subSubArray = subSub.getAsJsonArray("SUBSUB");

            subSub.getAsJsonObject().remove("name");

            int m = 0;

            while(m < subSubArray.size()) {

                subSubArray.get(m).getAsJsonObject().remove("SR");

                subSubArray.get(m).getAsJsonObject().remove("FI");

                subSubArray.get(m).getAsJsonObject().remove("IND");

                subSubArray.get(m).getAsJsonObject().addProperty("ST", "1");

                subSubArray.get(m).getAsJsonObject().addProperty("ID", "2");

                subSubArray.get(m).getAsJsonObject().addProperty("DESCR", "hi");

                m++;
            }
            m = 0;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

感谢@mmcrae帮助并建议了这种方法。

由于我已经在变量中保存了(键,值)对,因此您可以从父项中删除要更改其名称的属性,然后使用新名称和内容添加回来。已经保存了。

像这样:

JsonObject sites = element.getAsJsonObject();

JsonObject site1 = sites.getAsJsonObject("1");

JsonObject clust1 = site1.getAsJsonObject("CLUST");

site1.remove("CLUST");

site1.add("NEWCLUST", clust1);