[英]Gson: Directly convert String to JsonObject (no POJO)
Can't seem to figure this out.似乎无法弄清楚这一点。 I'm attempting JSON tree manipulation in GSON, but I have a case where I do not know or have a POJO to convert a string into, prior to converting to
JsonObject
.我正在 GSON 中尝试 JSON 树操作,但是在转换为
JsonObject
之前,我不知道或没有将字符串转换为 POJO 的情况。 Is there a way to go directly from a String
to JsonObject
?有没有办法直接从
String
转到JsonObject
?
I've tried the following (Scala syntax):我尝试了以下(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])
but a
fails, the JSON is escaped and parsed as a JsonString
only, and b
returns an empty JsonObject
.但是
a
失败了,JSON 被转义并仅解析为JsonString
,并且b
返回一个空的JsonObject
。
Any ideas?有任何想法吗?
use JsonParser;使用 JsonParser; for example:
例如:
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();
The simplest way is to use the JsonPrimitive
class, which derives from JsonElement
, as shown below:最简单的方法是使用派生自
JsonElement
的JsonPrimitive
类,如下所示:
JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
Just encountered the same problem.刚遇到同样的问题。 You can write a trivial custom deserializer for the
JsonElement
class:您可以为
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();
The JsonParser
constructor has been deprecated. JsonParser
构造函数已被弃用。 Use the static method instead:改用静态方法:
JsonObject asJsonObject = JsonParser.parseString(someString).getAsJsonObject();
I believe this is a more easy approach:我相信这是一种更简单的方法:
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;
}
}
And then you will be able to call it like this:然后你就可以这样调用它:
Gson gson = new GsonBuilder()
.registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter())
.create();
This way all the hibernate objects will be converted automatically.这样所有的休眠对象都将自动转换。
Came across a scenario with remote sorting of data store in EXTJS 4.X where the string is sent to the server as a JSON array (of only 1 object).在 EXTJS 4.X 中遇到了远程排序数据存储的场景,其中字符串作为 JSON 数组(只有 1 个对象)发送到服务器。
Similar approach to what is presented previously for a simple string, just need conversion to JsonArray first prior to JsonObject.类似于之前为简单字符串提供的方法,只需要在 JsonObject 之前先转换为 JsonArray。
String from client: [{"property":"COLUMN_NAME","direction":"ASC"}]来自客户端的字符串: [{"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");
com.google.gson.JsonParser#parse(java.lang.String)
is now deprecated com.google.gson.JsonParser#parse(java.lang.String)
现已弃用
so use com.google.gson.JsonParser#parseString
, it works pretty well所以使用
com.google.gson.JsonParser#parseString
,它工作得很好
Kotlin Example:科特林示例:
val mJsonObject = JsonParser.parseString(myStringJsonbject).asJsonObject
Java Example: Java 示例:
JsonObject mJsonObject = JsonParser.parseString(myStringJsonbject).getAsJsonObject();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.