【问题标题】:Reading JSon String with Gson使用 Gson 读取 JSON 字符串
【发布时间】:2010-11-23 13:24:52
【问题描述】:

我一直在谷歌周围寻找这个问题,但我似乎做不到。我有以下 json 字符串,该字符串从我需要与之交互的另一个源返回到我的 java 小程序。

{
 "A01": {"Status": "Ready", "Time": "00:00"}, 
 "A02": {"Status": "Ready", "Time": "00:00"}, 
 ......
}

目前我不确定应该如何使用 Gson 将其解析到我的小程序中。当我与该程序的设计者交谈时。 json 字符串是为 php 而不是 java 设计的,所以当我在 php 中对其进行解码时,它给了我一个很好的多维 assoc 数组。

对此有任何建议。

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    PHP 中的关联数组在 Java 中转换为 Map。因此,在 Gson 看来,您的 JSON 格式为 Map<String, Event>,其中 Event 类具有字段 statustime

    public class Event {
        private String Status;
        private String Time;
    
        // Add/generate getters, setters and other boilerplate.
    }
    

    是的,大写的字段名称很难看,但这就是您的 JSON 的样子。否则您需要创建一个custom Gson deserializer

    以下是转换它的方法。

    Map<String, Event> events = new Gson().fromJson(json, new TypeToken<Map<String, Event>>(){}.getType());
    

    A01A02 等成为Map 键,其值成为MapEvent 值。您可能需要添加另一个自定义反序列化器以将 Time 转换为 java.util.Date

    作为另一种选择,您也可以使用Map&lt;String, Map&lt;String, String&gt;&gt;

    【讨论】:

      【解决方案2】:

      那个链接指向我什至没有看的东西。我也忘了在我的帖子中提到了解 A01、A02 等非常重要。但是帖子中的一个链接是你指出我引导我想出这个对我有用的。

      JsonParser parse = new JsonParser();
      JsonObject jobj = (JsonObject)parse.parse(status);                            
      Set<Map.Entry<String, JsonElement>> map = jobj.entrySet();
      Iterator<Map.Entry<String, JsonElement>> iterator = map.iterator();
      int size = map.size();
      for( int k = 0; k < size; k++ )
      {
          Map.Entry<String, JsonElement> entry = iterator.next();
          String key = entry .getKey();
          JsonObject jele = (JsonObject)entry.getValue();
      }
      

      【讨论】:

      • 大部分 JSON 库都有一两行操作来做同样的事情;不需要手动编写此代码。对于 Gson,我认为您需要通过 TypeToken> 来获得预期的结果。
      • 虽然我理解这一点,但我通常会有人使用我的那个,虽然他们可以做一些编程,但不是在那里工作。像这样打破东西,虽然它是更多的代码。当他们看到它时,他们会更容易。
      【解决方案3】:

      如果您的 json 略有不同,如下所示:

      {
       [
        {"Status": "Ready", "Time": "00:00"}, 
        {"Status": "Ready", "Time": "00:00"}, 
        ......
       ]
      }
      

      Gson 将能够将 json 转换为对象集合,您必须自己定义该对象。所以你需要:

      public class myAClass {
      public String Status;
      public Double time; //this could be a string/or even a Date I guess, 
                          //not sure what data you are expecting
                          //and the colon may cause a problem if parsed as a double
      }
      

      然后像这样使用它:

      Type listType = new TypeToken<List<myAClass>>() {}.getType();
      List<myAClass> myAClassList = new Gson().fromJson(json, listType); 
      //where json is yr json string
      

      然后您可以根据需要使用对象列表。

      (进一步阅读here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 2011-11-11
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多