【问题标题】:Json parsing with nested array using Gson使用 Gson 使用嵌套数组解析 Json
【发布时间】:2016-03-01 17:35:45
【问题描述】:

我没有在网上看到讨论这种嵌套 json 数组的(已回答的)示例。

要解析的JSON:

{
    "Field": {
        "ObjectsList": [
            {
                "type": "Num",
                "priority": "Low",
                "size": 3.43
            },
            {
                "type": "Str",
                "priority": "Med",
                "size": 2.61
            }
        ]
    }
}

我为嵌套 json 块的每个“级别”创建了一个类。我希望能够解析“ObjectList”数组的内容。

谁能帮我在 Java 中使用 Gson 解析这个 JSON? 任何提示或代码-sn-ps 将不胜感激。

我的方法如下:

public static void main (String... args) throws Exception 
{
    URL jsonUrl = new URL("http://jsonUrl.com") // cannot share the url
    try (InputStream input = jsonUrl.openStream(); 
         BufferedReader buffReader = new BufferedReader (new InputStreamReader (input, "UTF-8"))) 
        {
         Gson gson = new GsonBuilder().create();
         ClassA classA = gson.fromJson(buffReader, ClassA.class);

         System.out.println(classA);
        }
    }
}


class ClassA 
{
    private String field;
    // getter & setter //
}

class ClassB
{
    private List<ClassC> objList;
    // getter & setter //
}

clas ClassC
{
    private String type;
    private String priority;
    private double size;
    // getters & setters //

    public String printStr()
    {
        return String.format(type, priority, size);
    }
}

【问题讨论】:

    标签: java json parsing gson


    【解决方案1】:

    以下 sn-p 和源文件会对您有所帮助:

    https://github.com/matpalm/common-crawl-quick-hacks/blob/master/links_in_metadata/src/com/matpalm/MetaDataToTldLinks.java#L17

    private static ParseResult NO_LINKS = new ParseResult(new HashSet<String>(), 0);
      private JsonParser parser;
    
      public static void main(String[] s) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(s[0]));
        MetaDataToTldLinks metaDataToTldLinks = new MetaDataToTldLinks();
        while (reader.ready()) {
          String[] fields = reader.readLine().split("\t");
          ParseResult outboundLinks = metaDataToTldLinks.outboundLinks(fields[1]);
          System.out.println(tldOf(fields[0]) + " " + outboundLinks.links);      
        }
      }
    
      public MetaDataToTldLinks() {
        this.parser = new JsonParser();
      }
    
      public ParseResult outboundLinks(String jsonMetaData) {
        JsonObject metaData = parser.parse(jsonMetaData.toString()).getAsJsonObject();
    
        if (!"SUCCESS".equals(metaData.get("disposition").getAsString()))
          return NO_LINKS;
    
        JsonElement content = metaData.get("content");
        if (content == null)
          return NO_LINKS;
    
        JsonArray links = content.getAsJsonObject().getAsJsonArray("links");
        if (links == null)
          return NO_LINKS;
    
        Set<String> outboundLinks = new HashSet<String>();
        int numNull = 0;
        for (JsonElement linke : links) {
          JsonObject link = linke.getAsJsonObject();
          if ("a".equals(link.get("type").getAsString())) { // anchor        
            String tld = tldOf(link.get("href").getAsString());
            if (tld == null)
              ++numNull;
            else
              outboundLinks.add(tld);
          }
        }
        return new ParseResult(outboundLinks, numNull);
    
      }
    
      public static String tldOf(String url) {
        try {
          String tld = new URI(url).getHost();
          if (tld==null)
              return null;
          if (tld.startsWith("www."))
            tld = tld.substring(4);
          tld = tld.trim();
          return tld.length()==0 ? null : tld;
        }
        catch (URISyntaxException e) {
          return null;
        }
      }
    
      public static class ParseResult {
        public final Set<String> links;
        public final int numNull;
        public ParseResult(Set<String> links, int numNull) {
          this.links = links;
          this.numNull = numNull;
        }
      }
    

    【讨论】:

      【解决方案2】:

      这个snippet怎么样?:

      if (json.isJsonArray()) {
        JsonArray array = json.getAsJsonArray();
        List<Object> out = Lists.newArrayListWithCapacity(array.size());
        for (JsonElement item : array) {
          out.add(toRawTypes(item));
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多