【问题标题】:Gson: Directly convert String to JsonObject (no POJO)Gson:直接将String转换为JsonObject(无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

有什么想法吗?

【问题讨论】:

标签: java json gson


【解决方案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 stackoverflow.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();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-01
            • 2021-04-12
            • 2019-02-03
            • 2016-10-29
            相关资源
            最近更新 更多