16

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

以下是用例:

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

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

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

4

6 回答 6

13

这是我想出的最短的。

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

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

于 2013-04-10T05:01:29.887 回答
3

您始终可以获得与 JsonElement 不同的类型,或者使用 JsonElement.getAsJsonObject 强制转换为对象(如果可能)。

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 并使用转换工具。

于 2013-01-24T17:25:57.277 回答
2

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

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

于 2013-01-24T16:21:20.163 回答
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());
}
}
于 2013-01-24T17:14:17.760 回答
0

jsonString 是一个普通的、普通的 Java 字符串;因此您可以使用 Java 的标准字符串函数随意修改它,并将子字符串替换key1Test1

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

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

于 2013-01-24T17:24:29.017 回答
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);
    }
}
于 2019-04-24T23:54:30.310 回答