简体   繁体   English

使用 Gson 使用嵌套数组解析 Json

[英]Json parsing with nested array using Gson

I have not seen an (answered) example on the web which discusses this kind of nested-json-array.我还没有在网上看到讨论这种嵌套 json-array 的(已回答的)示例。

JSON to be parsed:要解析的 JSON:

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

I created a class for each 'level' of nested json block.我为嵌套 json 块的每个“级别”创建了一个类。 I want to be able to parse the contents of the "ObjectList" array.我希望能够解析“ObjectList”数组的内容。

Can anyone help me to parse this JSON using Gson in Java?谁能帮我在 Java 中使用 Gson 解析这个 JSON? Any hints or code-snippets would be greatly appreciated.任何提示或代码片段将不胜感激。

My approach is the following:我的方法如下:

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

The following snippet and source file would help you:以下代码段和源文件将帮助您:

https://github.com/matpalm/common-crawl-quick-hacks/blob/master/links_in_metadata/src/com/matpalm/MetaDataToTldLinks.java#L17 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;
    }
  }

How about this snippet ?:这个片段怎么样?:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM