Gson:直接将String转换为JsonObject(不是POJO)

似乎无法弄清楚这一点。 我试图在GSON JSON树操作,但我有一个情况,我不知道或有一个POJO转换成一个string之前,转换为JsonObject 。 有没有办法直接从StringJsonObject

我试过以下(斯卡拉语法):

 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]) 

但是失败了,JSON被转义并且仅仅被parsing为一个JsonString ,并且b返回一个空的JsonObject

有任何想法吗?

使用JsonParser; 例如:

 JsonParser parser = new JsonParser(); JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject(); 

尝试使用getAsJsonObject()而不是在接受的答案中使用的直接转换:

 JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject(); 
 String jsonStr = "{\"a\": \"A\"}"; Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject(); 

最简单的方法是使用从JsonElement派生的JsonPrimitive类,如下所示:

 JsonElement element = new JsonPrimitive(yourString); JsonObject result = element.getAsJsonObject(); 

刚遇到同样的问题。 您可以为JsonElement类编写一个简单的自定义解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(); 

我相信这是一个更简单的方法:

 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对象都会被自动转换。

在EXTJS 4.X中的远程数据存储sorting中发现一个场景,其中string作为JSON数组(仅包含1个对象)发送到服务器。
前面提到的简单string类似的方法,只需要在JsonObject之前首先转换为JsonArray。

来自客户端的string: [{“property”:“COLUMN_NAME”,“direction”:“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()); 
 //import com.google.gson.JsonObject; JsonObject complaint = new JsonObject(); complaint.addProperty("key", "value");