Gson:将字符串直接转换为JsonObject(无需POJO)

331

我似乎想不出解决方法。 我正在尝试在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

有什么想法吗?


2
注意gson验证陷阱:https://dev59.com/JlgQ5IYBdhLWcg3wJgmO#47890960 - Vadzim
10个回答

559

使用JsonParser,例如:

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

18
好的,我会尽力进行翻译。下面是需要翻译的内容:"ugh should have a static 1 liner convenience method" - Blundell
44
将 JsonObject 的强制类型转换是不必要的,更好的做法是使用 new JsonParser().parse(..).getAsJsonObject(); - Chriss
1
我猜JsonParser是一个抽象类。 - Jatin Sehgal
1
@KevinMeredith,你的链接已经失效了,请使用这个链接 - Ninja
15
请注意,此方法现已过时。请使用JsonParser.parseString(str).getAsJsonObject() - Michael Röhrig
显示剩余7条评论

149

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

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

2
由于某些原因,它会在 members 父键中包装。以下是一个示例: { "members" : { "key1" : "13756963814f2c594822982c0307fb81", "key2" : true, "key3" : 123456789 } } - Hossain Khan
1
使用最新的gson库,比如2.2.4。版本2.2.2出于某种原因添加了成员标签。 - Rubin Yoo
5
JsonParser().parse()在新版的Gson中已被弃用。请使用JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()或者Gson gson = new Gson(); JsonElement element = gson.fromJson(jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject(); - Jimmy Garpehäll

62
String jsonStr = "{\"a\": \"A\"}";

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();

你能否使用GSON的方式验证我的答案,将List数据转换为jsonobject?链接:http://stackoverflow.com/questions/18442452/create-an-array-of-json-objects/18443395#18443395 - LOG_TAG
3
我已经验证了你的答案。 - Purushotham
@knoxxs,您是指JsonObject类的定义吗?它来自于Google的Gson库。您可以参考这里的文档:http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html。 - Purushotham
1
这让我出现了一个错误,指出JsonElement没有无参构造函数。 - clapas

42

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

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

2
这是最简单的答案,帮了我很多。谢谢! - khiner

11

我也遇到了相同的问题。您可以为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();

7

JsonParser 构造函数已被弃用,使用静态方法代替:

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

4
我认为这是一种更简单的方法:
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对象都将自动转换。


2

在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());

1

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();

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

以上是将键值数据转换为GSON对象的最简单方法。 - Maddy
1
谢谢,我的情况是我有一个未解析的JSON字符串,我需要从这里开始。 - 7zark7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接