我想修改json内容而不将其转换为POJO。我正在使用GSON Library。
以下是用例:
String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]";
JsonElement jsonElement = gson.fromJson(jsonString, JsonElement.class);
有没有什么方法可以将key1的值设置为每个数组中的某个值(比如说“Test”),而不将事物转换为POJO
这是我想出的最短的。
JsonElement je = gson.fromJson(jsonString, JsonElement.class);
JsonObject jo = je.getAsJsonObject();
jo.add("key", value);
一旦你有了JsonObject,gson有很多方法来操作它。
这是我想出的最短的。
JsonElement je = gson.fromJson(jsonString, JsonElement.class);
JsonObject jo = je.getAsJsonObject();
jo.add("key", value);
一旦你有了JsonObject,gson有很多方法来操作它。
一种方法是将JSON转换为 java.util.Map
,修改Map,然后从那里开始(这可能意味着将Map序列化为JSON)。
这种方法符合我的偏好,可以使用正确的API来完成正确的工作,最大限度地减少使用像Gson这样的工具来处理序列化/反序列化(这是我理解它的设计目的)。也就是说,不要将Gson API用作替换数据结构。
您始终可以获得与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并使用铸造工具。
GSON有两个独立的API(可以组合):一个用于序列化和反序列化,另一个用于流式传输。如果您想要处理JSON流而没有内存开销或使用动态结构(而不是静态POJO),您可以执行以下操作:
- 创建一个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());
}
}
jsonString是一个简单的普通Java String;因此,您可以使用Java的标准字符串函数修改它,并替换子字符串 key1
同 Test1
:
jsonString = "[{\"key1\":\"Test\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]";
当然,Java中的String是不可变的,因此首先将其转换为StringBuilder可能会在内存使用方面提供更好的性能。