Gson:直接将String转换为JsonObject(无POJO)
Posted
技术标签:
【中文标题】Gson:直接将String转换为JsonObject(无POJO)【英文标题】:Gson: Directly convert String to JsonObject (no POJO) 【发布时间】:2011-05-05 20:53:14 【问题描述】:似乎无法弄清楚这一点。
我正在尝试在 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
。
有什么想法吗?
【问题讨论】:
提防 gson 验证陷阱:***.com/questions/43233898/… 【参考方案1】:使用 JsonParser;例如:
JsonObject o = JsonParser.parseString("\"a\": \"A\"").getAsJsonObject();
【讨论】:
呃应该有一个 static 1 liner 方便方法 强制转换为 JsonObject 是不必要的,最好使用new JsonParser().parse(..).getAsJsonObject();
我猜JsonParser是一个抽象类
@KevinMeredith 你的链接坏了,请使用this
请注意,此方法现已弃用。使用JsonParser.parseString(str).getAsJsonObject()
。【参考方案2】:
尝试使用getAsJsonObject()
,而不是在接受的答案中使用直接转换:
JsonObject o = new JsonParser().parse("\"a\": \"A\"").getAsJsonObject();
【讨论】:
由于某种原因,它使用members
父键包装。这是一个示例 "members" : "key1" : "13756963814f2c594822982c0307fb81", "key2" : true, "key3" : 123456789
使用最新的 gson 库,比如 2.2.4。 2.2.2之类的版本由于某种原因添加了members标签。
JsonParser().parse() 在较新版本的 Gson 中已弃用。使用JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()
或Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
【参考方案3】:
String jsonStr = "\"a\": \"A\"";
Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();
【讨论】:
你能用 GSON 方式验证我的答案吗,通过 gson ***.com/questions/18442452/… 将 List 数据转换为 jsonobject 我已经验证了你的答案。 @knoxxs,你的意思是JsonObject
类定义?它来自谷歌的 Gson 库。您可以参考文档here。
这给了我一个错误,抱怨 JsonElement 没有无参数构造函数。【参考方案4】:
最简单的方法是使用JsonPrimitive
类,它派生自JsonElement
,如下所示:
JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
【讨论】:
这是最简单的答案,帮助了我。谢谢!【参考方案5】:刚刚遇到同样的问题。您可以为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();
【讨论】:
【参考方案6】:JsonParser
构造函数已被弃用。改用静态方法:
JsonObject asJsonObject = JsonParser.parseString(someString).getAsJsonObject();
【讨论】:
【参考方案7】:我相信这是一种更简单的方法:
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();
这样所有的休眠对象都会自动转换。
【讨论】:
【参考方案8】:在 EXTJS 4.X 中遇到了对数据存储进行远程排序的场景,其中字符串作为 JSON 数组(只有 1 个对象)发送到服务器。 与前面介绍的简单字符串类似的方法,只需要在 JsonObject 之前先转换为 JsonArray。
来自客户端的字符串:["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());
【讨论】:
【参考方案9】://import com.google.gson.JsonObject;
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
【讨论】:
以上是将您的键值数据转换为 gson 对象的最简单方法。 谢谢,就我而言,我有一个未解析的 JSON 字符串,我需要从它开始。【参考方案10】: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();
【讨论】:
以上是关于Gson:直接将String转换为JsonObject(无POJO)的主要内容,如果未能解决你的问题,请参考以下文章