我想修改json内容而不将其转换为POJO。我正在使用GSON Library。
以下是用例:
String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]";
JsonElement jsonElement = gson.fromJson(jsonString, JsonElement.class);
有什么方法可以将key1的值设置为每个数组中的某个值(比如说“Test”),而无需将内容转换为POJO
答案 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流,您可以执行以下操作:
循环将包含一个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);
}
}