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)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gson 库将字符串转换为 JsonObject

java中如何将对象转成json格式字符串

jsonObject和JsonArray转化String

如何防止 Gson 将整数表示为浮点数

当从共享prefs获取时,GSON将先前存储的List转换为LinkedTreeMaps的ArrayList

如何在android中把JSON对象转换为string