似乎无法弄清楚这一点。
我正在尝试在GSON中进行JSON树操作,但我有一个案例,在转换为JsonObject
之前,我不知道或有一个POJO将字符串转换为。有没有办法直接从String
转到JsonObject
?
我尝试了以下(Scala语法):
val gson = (new GsonBuilder).create
val a: JsonObject = gson.toJsonTree("""{ "a": "A", "b": true }""").getAsJsonObject
val b: JsonObject = gson.fromJson("""{ "a": "A", "b": true }""", classOf[JsonObject])
但是a
失败,JSON被转义并仅被解析为JsonString
,并且
b
会返回一个空的JsonObject
。
有什么想法吗?
答案 0 :(得分:494)
使用JsonParser;例如:
JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();
答案 1 :(得分:140)
尝试使用getAsJsonObject()
代替接受答案中使用的直接投射:
JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();
答案 2 :(得分:44)
String jsonStr = "{\"a\": \"A\"}";
Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();
答案 3 :(得分:31)
最简单的方法是使用JsonPrimitive
类,该类派生自JsonElement
,如下所示:
JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
答案 4 :(得分:10)
刚遇到同样的问题。您可以为JsonElement
类编写一个简单的自定义反序列化器:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
GsonBuilder gson_builder = new GsonBuilder();
gson_builder.registerTypeAdapter(
JsonElement.class,
new JsonDeserializer<JsonElement>() {
@Override
public JsonElement deserialize(JsonElement arg0,
Type arg1,
JsonDeserializationContext arg2)
throws JsonParseException {
return arg0;
}
} );
String str = "{ \"a\": \"A\", \"b\": true }";
Gson gson = gson_builder.create();
JsonElement element = gson.fromJson(str, JsonElement.class);
JsonObject object = element.getAsJsonObject();
答案 5 :(得分:3)
我认为这是一种更简单的方法:
public class HibernateProxyTypeAdapter implements JsonSerializer<HibernateProxy>{
public JsonElement serialize(HibernateProxy object_,
Type type_,
JsonSerializationContext context_) {
return new GsonBuilder().create().toJsonTree(initializeAndUnproxy(object_)).getAsJsonObject();
// that will convert enum object to its ordinal value and convert it to json element
}
public static <T> T initializeAndUnproxy(T entity) {
if (entity == null) {
throw new
NullPointerException("Entity passed for initialization is null");
}
Hibernate.initialize(entity);
if (entity instanceof HibernateProxy) {
entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer()
.getImplementation();
}
return entity;
}
}
然后你可以这样称呼它:
Gson gson = new GsonBuilder()
.registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter())
.create();
这样所有的hibernate对象都会自动转换。
答案 6 :(得分:1)
遇到了在EXTJS 4.X中远程排序数据存储的场景,其中字符串作为JSON数组(仅1个对象)发送到服务器。
类似于先前为简单字符串提供的内容,只需要在JsonObject之前首先转换为JsonArray。
来自客户的字符串: [{“property”:“COLUMN_NAME”,“方向”:“ASC”}]
String jsonIn = "[{\"property\":\"COLUMN_NAME\",\"direction\":\"ASC\"}]";
JsonArray o = (JsonArray)new JsonParser().parse(jsonIn);
String sortColumn = o.get(0).getAsJsonObject().get("property").getAsString());
String sortDirection = o.get(0).getAsJsonObject().get("direction").getAsString());
答案 7 :(得分:1)
//import com.google.gson.JsonObject;
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
答案 8 :(得分:1)
com.google.gson.JsonParser#parse(java.lang.String)
现已弃用
所以使用com.google.gson.JsonParser#parseString
,效果很好
Kotlin 示例:
val mJsonObject = JsonParser.parseString(myStringJsonbject).asJsonObject
Java 示例:
JsonObject mJsonObject = JsonParser.parseString(myStringJsonbject).getAsJsonObject();
答案 9 :(得分:0)
JsonParser
构造函数已被弃用。无需实例化此类,请改用静态方法。
JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();