首页 文章

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

提问于
浏览
258

可以在GSON中尝试JSON树操作,但在转换为 JsonObject 之前,我有一个我不知道或有POJO将字符串转换为的情况 . 有没有办法直接从 StringJsonObject

我尝试了以下(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 .

有任何想法吗?

8 回答

  • 42

    使用JsonParser;例如:

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

    尝试使用 getAsJsonObject() 而不是在接受的答案中使用的直接演员:

    JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();
    
  • 29
    String jsonStr = "{\"a\": \"A\"}";
    
    Gson gson = new Gson();
    JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
    JsonObject jsonObj = element.getAsJsonObject();
    
  • 1

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

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

    刚遇到同样的问题 . 您可以为 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();
    
  • 3

    我相信这是一个更简单的方法:

    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对象都将自动转换 .

  • 1

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

相关问题