Gson:直接将String转换为JsonObject(无POJO)


300

似乎无法弄清楚。我正在GSON中尝试JSON树操作,但是在转换为之前,我不知道或没有POJO将字符串转换为的情况JsonObject。是否有办法直接从a 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返回一个empty JsonObject

有任何想法吗?


Answers:


525

使用JsonParser; 例如:

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

17
啊应该有一个静态1个衬垫简便方法
布伦德尔

43
强制转换为JsonObject是不必要的,更好地使用new JsonParser().parse(..).getAsJsonObject();
Chriss

1
我猜JsonParser是一个抽象类
Jatin Sehgal的

1
@KevinMeredith您的链接已损坏,请使用
Ninja

4
请注意,现在不建议使用此方法。使用JsonParser.parseString(str).getAsJsonObject()
迈克尔·罗里格(MichaelRöhrig),

147

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

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

2
由于某种原因,它使用members父键进行包装。这是一个示例{“成员”:{“ key1”:“ 13756963814f2c594822982c0307fb81”,“ key2”:true,“ key3”:123456789}}
Hossain Khan

1
使用最新的gson库,例如2.2.4。像2.2.2这样的版本出于某种原因添加了members标签。
Rubin Yoo 2015年

2
较新版本的Gson不推荐使用JsonParser()。parse()。使用JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
JimmyGarpehäll,

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

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

您可以通过GSON验证我的GSON办法答案转换列表数据的JSONObject stackoverflow.com/questions/18442452/...
LOG_TAG

3
我已经验证了您的答案。
2014年

@knoxxs,您的意思是JsonObject类定义?它来自Google的Gson库。您可以在此处参考文档。
Purushotham

这给我一个抱怨JsonElement没有无参数构造函数的错误。
克拉帕斯2015年

37

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

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

2
这是最简单的答案,并帮助了我。谢谢!
khiner 2014年

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

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

这样,所有休眠对象将被自动转换。


3

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

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();

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
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

上面是将键值数据转换为gson对象的最简单方法。
Maddy

1
谢谢,就我而言,我有一个未解析的JSON字符串,我需要从该字符串开始。
7zark7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.