使用GSON修改json而不使用POJO

时间:2013-01-24 10:46:09

标签: java json gson

我想修改json内容而不将其转换为POJO。我正在使用GSON Library。

以下是用例:

String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]";

JsonElement jsonElement = gson.fromJson(jsonString, JsonElement.class);     

有什么方法可以将key1的值设置为每个数组中的某个值(比如说“Test”),而无需将内容转换为POJO

6 个答案:

答案 0 :(得分:8)

这是我提出的最短时间。

JsonElement je = new Gson().fromJson(jsonString, JsonElement.class);
JsonObject jo = je.getAsJsonObject();
jo.add("key", value);

一旦你拥有了JsonObject,gson就有很多方法可以操作它。

答案 1 :(得分:2)

一种方法是将JSON转换为java.util.Map,修改Map,然后从那里开始(这可能意味着将Map序列化为JSON)。

这种方法符合我的偏好,可以使用正确的API来完成正确的工作,最大限度地减少使用像Gson这样的工具来处理序列化/反序列化(这是我理解它的设计目的)。也就是说,不要将Gson API用作替换数据结构。

答案 2 :(得分:2)

您总是可以获得与JsonElement不同的类型,或使用JsonElement.getAsJsonObject强制转换为Object(如果可能)。

String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"}, ...]";

JsonArray jsonArray = gson.fromJson(jsonString, JsonElement.class).getAsJsonArray();
JsonObject firstObject = jsonArray.get(i).getAsJsonObject();
firstObject.addProperty("key1", "Test");
我早先错了;似乎没有JsonArray适配器;你必须得到一个JsonElement并使用铸造工具。

答案 3 :(得分:0)

GSON有两个独立的API(可以组合):一个用于序列化和反序列化,另一个用于流式传输。如果您想在没有内存开销或使用动态结构(而不​​是静态POJO)的情况下处理JSON流,您可以执行以下操作:

  • 创建一个JsonWriter(在我的示例中,我使用StringWriter);
  • 创建一个JsonReader;
  • 制作一个循环,消耗来自读者的事件并将其提供给作者,可能会进行更改,添加,遗漏等。

循环将包含一个switch语句,该语句必须包含所有可能事件(其中10个)。即使最简单的例子也必须包含所有这些,所以下面的代码看起来相当冗长。但它很容易扩展,进一步扩展不会延长它。

附加“test”的示例:每个对象的1对看起来像:

public class Whatever {

static void streamandmodify(JsonReader reader, JsonWriter writer) throws IOException {
    while (true) {
        JsonToken token = reader.peek();
        switch (token) {
        // most cases are just consume the event
        // and pass an identical one to the writer
        case BEGIN_ARRAY:
            reader.beginArray();
            writer.beginArray();
            break;
        case END_ARRAY:
            reader.endArray();
            writer.endArray();
            break;
        case BEGIN_OBJECT:
            reader.beginObject();
            writer.beginObject();

            // this is where the change happens:
            writer.name("test");
            writer.value(1);
            break;
        case END_OBJECT:
            reader.endObject();
            writer.endObject();
            break;
        case NAME:
            String name = reader.nextName();
            writer.name(name);
            break;
        case STRING:
            String s = reader.nextString();
            writer.value(s);
            break;
        case NUMBER:
            String n = reader.nextString();
            writer.value(new BigDecimal(n));
            break;
        case BOOLEAN:
            boolean b = reader.nextBoolean();
            writer.value(b);
            break;
        case NULL:
            reader.nextNull();
            writer.nullValue();
            break;
        case END_DOCUMENT:
            return;
        }
    }
}


public static void main(String[] args) throws IOException {
    // just for test:
    JsonReader jr = new JsonReader(new StringReader("{\"a\":1, \"b\":{\"c\":[1,2,3,{},{}]}}"));
    StringWriter sw = new StringWriter();
    JsonWriter jw = new JsonWriter(sw);
    streamandmodify(jr, jw);
    System.out.println(sw.getBuffer().toString());
}
}

答案 4 :(得分:0)

jsonString是一个简单的普通Java String;因此,您可以使用Java的标准字符串函数修改它,并将子字符串key1替换为Test1

jsonString = "[{\"key1\":\"Test\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]";

当然,Java中的String是不可变的,因此首先将它转换为StringBuilder可能会在内存使用方面提供更好的性能。

答案 5 :(得分:0)

使用GSON JsonArray Java 8修改json

如何使用GSON修改JSON中的值的示例

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class ModifyJson {
    public static void main(String[] args) {
        String data = "[{\"ct_pk\":24,\"ct_name\":\"SISTEMA DE PRUEBAS\"},"
                + "{\"ct_pk\":1,\"ct_name\":\"CAPITAL FEDERAL\"}," +
                "{\"ct_pk\":5,\"ct_name\":\"SISTEMA DE PRUEBAS DOS\"}]";

        System.out.println("before................." + data);

        JsonArray jsonArray = new Gson().fromJson(data, JsonElement.class).getAsJsonArray();
        JsonArray jsonArray2 = new JsonArray();
        for (JsonElement pa : jsonArray) {
            JsonObject jsonObject2 = pa.getAsJsonObject();
            String ct_name = jsonObject2.get("ct_name").getAsString();
            if (ct_name.equals("SISTEMA DE PRUEBAS")) {
                jsonObject2.addProperty("ct_name", "TODOS");
            }
            jsonArray2.add(jsonObject2);
        }
        System.out.println("after.................." +jsonArray2);
    }
}