Gson:直接转换字符串为JsonObject(没有POJO)

我好像弄不明白。 我正在尝试在GSON中的JSON树操作,但我有一个情况,我不知道或有一个POJO转换为字符串,在转换为JsonObject之前。是否有一种方法可以直接从StringJsonObject?< / p >

我尝试了以下(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

什么好主意吗?

356615 次浏览

使用JsonParser;例如:

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

刚刚遇到了同样的问题。你可以为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();

尝试使用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();
在EXTJS 4中遇到了对数据存储进行远程排序的场景。
. X,其中字符串作为JSON数组发送到服务器(只有一个对象) 类似于前面为简单字符串提供的方法,只需要在JsonObject之前先转换为JsonArray

客户端字符串:[{“财产”:“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());

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

JsonElement element = new JsonPrimitive(yourString);
JsonObject result = 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对象都将自动转换。

//import com.google.gson.JsonObject;
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

JsonParser构造函数已弃用。请使用静态方法:

JsonObject asJsonObject = JsonParser.parseString(someString).getAsJsonObject();

com.google.gson.JsonParser#parse(java.lang.String)现在已弃用

所以使用com.google.gson.JsonParser#parseString,它工作得很好

芬兰湾的科特林的例子:

val mJsonObject = JsonParser.parseString(myStringJsonbject).asJsonObject

Java示例:

JsonObject mJsonObject = JsonParser.parseString(myStringJsonbject).getAsJsonObject();