Java 使用 GSON 反对 JSON
Java Object to JSON using GSON
我有一个对象数组,它是一个函数可以采用的参数值列表。这可以是任何复杂的对象。
我正在尝试使用 gson 从对象数组中构建一个 json,如下所示:
private JsonArray createArgsJsonArray(Object... argVals) {
JsonArray argsArray = new JsonArray();
Arrays.stream(argVals).forEach(arg -> argsArray.add(gson.toJson(arg)));
return argsArray;
}
- 这会将所有 arg 值视为字符串。
它转义字符串参数
"args":["\"STRING\"","1251996697","85"]
我更喜欢以下输出:
"args":["STRING",1251996697,85]
有没有办法使用 gson 实现此目的?
我使用了org.json
,我能够达到预期的效果,但它不适用于复杂的对象。
编辑:
我应用了@Michał Ziober 提供的解决方案,但现在我该如何找回对象。
Gson gson = new Gson();
Object strObj = "'";
JsonObject fnObj = new JsonObject();
JsonObject fnObj2 = new JsonObject();
fnObj.add("response", gson.toJsonTree(strObj));
fnObj2.addProperty("response", gson.toJson(strObj));
System.out.println(gson.fromJson(fnObj.toString(),
Object.class)); --> prints {response='} //Not what I want!
System.out.println(gson.fromJson(fnObj2.toString(),
Object.class)); --> prints {response="\u0027"}
尝试使用 setPrettyPrinting
和 DisableHtml
转义。
Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(jsonArray.toString());
System.out.println( gson.toJson(je));
使用toJsonTree
方法:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import java.util.Date;
public class GsonApp {
public static void main(String[] args) {
GsonApp app = new GsonApp();
System.out.println(app.createArgsJsonArray("text", 1, 12.2D));
System.out.println(app.createArgsJsonArray(new Date(), new A(), new String[] {"A", "B"}));
}
private Gson gson = new GsonBuilder().create();
private JsonArray createArgsJsonArray(Object... argVals) {
JsonArray argsArray = new JsonArray();
for (Object arg : argVals) {
argsArray.add(gson.toJsonTree(arg));
}
return argsArray;
}
}
class A {
private int id = 12;
}
以上代码打印:
["text",1,12.2]
["Sep 19, 2019 3:25:20 PM",{"id":12},["A","B"]]
如果你想以字符串结尾,只需执行以下操作:
private String createArgsJsonArray(Object... argVals) {
Gson gson = new Gson();
return gson.toJson(argVals);
}
如果你想把它取回来并改变就这样做:
Object[] o = new Gson().fromJson(argValsStr, Object[].class);
我有一个对象数组,它是一个函数可以采用的参数值列表。这可以是任何复杂的对象。
我正在尝试使用 gson 从对象数组中构建一个 json,如下所示:
private JsonArray createArgsJsonArray(Object... argVals) {
JsonArray argsArray = new JsonArray();
Arrays.stream(argVals).forEach(arg -> argsArray.add(gson.toJson(arg)));
return argsArray;
}
- 这会将所有 arg 值视为字符串。
它转义字符串参数
"args":["\"STRING\"","1251996697","85"]
我更喜欢以下输出:
"args":["STRING",1251996697,85]
有没有办法使用 gson 实现此目的?
我使用了org.json
,我能够达到预期的效果,但它不适用于复杂的对象。
编辑:
我应用了@Michał Ziober 提供的解决方案,但现在我该如何找回对象。
Gson gson = new Gson();
Object strObj = "'";
JsonObject fnObj = new JsonObject();
JsonObject fnObj2 = new JsonObject();
fnObj.add("response", gson.toJsonTree(strObj));
fnObj2.addProperty("response", gson.toJson(strObj));
System.out.println(gson.fromJson(fnObj.toString(),
Object.class)); --> prints {response='} //Not what I want!
System.out.println(gson.fromJson(fnObj2.toString(),
Object.class)); --> prints {response="\u0027"}
尝试使用 setPrettyPrinting
和 DisableHtml
转义。
Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(jsonArray.toString());
System.out.println( gson.toJson(je));
使用toJsonTree
方法:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import java.util.Date;
public class GsonApp {
public static void main(String[] args) {
GsonApp app = new GsonApp();
System.out.println(app.createArgsJsonArray("text", 1, 12.2D));
System.out.println(app.createArgsJsonArray(new Date(), new A(), new String[] {"A", "B"}));
}
private Gson gson = new GsonBuilder().create();
private JsonArray createArgsJsonArray(Object... argVals) {
JsonArray argsArray = new JsonArray();
for (Object arg : argVals) {
argsArray.add(gson.toJsonTree(arg));
}
return argsArray;
}
}
class A {
private int id = 12;
}
以上代码打印:
["text",1,12.2]
["Sep 19, 2019 3:25:20 PM",{"id":12},["A","B"]]
如果你想以字符串结尾,只需执行以下操作:
private String createArgsJsonArray(Object... argVals) {
Gson gson = new Gson();
return gson.toJson(argVals);
}
如果你想把它取回来并改变就这样做:
Object[] o = new Gson().fromJson(argValsStr, Object[].class);