在Java中解析嵌套的JSON

时间:2012-05-05 00:44:57

标签: java json parsing

我只是想问一下,如何简单地解析Java中嵌套的JSON结构,如下所示:

{
   "goods":{
      "NY Store":[
         {
            "product":"Teddybear",
            "available":"20"
         },
         {
            "product":"Mountain bike",
            "available":"0"
         }]
      "LA Store":[
         {
            "product": ....and so on

我想从所有商店获得所有产品,但名单相当大(200家商店)。有什么提示和提示吗?

4 个答案:

答案 0 :(得分:1)

为什么不使用图书馆? http://www.json.org/java/

具体地,

public JSONObject(String source) throws JSONException {
        this(new JSONTokener(source));
}

答案 1 :(得分:1)

这是介绍杰克逊图书馆特定用例的快速介绍。

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize;

public class JSONTest {
    /**
     * @param args
     * @throws IOException
     * @throws JsonMappingException
     * @throws JsonGenerationException
     */
    public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        HashMap<String, ArrayList<InventoryItem>> fs = new HashMap<String, ArrayList<InventoryItem>>();
        for (int i = 0; i < 5; i++) {
            ArrayList<InventoryItem> its = new ArrayList<InventoryItem>();
            its.add(new InventoryItem("teddy", 20));
            its.add(new InventoryItem("diny", 10));
            fs.put(Long.toString(System.nanoTime()), its);
        }
        StoreContianer g = new StoreContianer(fs);
        ObjectMapper objm = new ObjectMapper();
        StringWriter sw = new StringWriter();
        objm.writeValue(sw, g);
        System.out.println(sw.toString());
        StoreContianer c = objm.readValue(
                "{\"goods\":{\"55278650620460\":[{\"product\":\"teddy\",\"available\":20},{\"product\":\"diny\",\"available\":10}],\"55278650631327\":[{\"product\":\"teddy\",\"available\":20},{\"product\":\"diny\",\"available\":10}],\"55278650628131\":[{\"product\":\"teddy\",\"available\":20},{\"product\":\"diny\",\"available\":10}],\"55278650582748\":[{\"product\":\"teddy\",\"available\":20},{\"product\":\"diny\",\"available\":10}],\"55278650624615\":[{\"product\":\"teddy\",\"available\":20},{\"product\":\"diny\",\"available\":10}]}}",
                StoreContianer.class);
        StringWriter sw2 = new StringWriter();
        objm.writeValue(sw2, c);
        System.out.println(sw2.toString());
    }
}

@JsonSerialize
class StoreContianer {
    private final HashMap<String, ArrayList<InventoryItem>> goods;

    public StoreContianer(@JsonProperty("goods") HashMap<String, ArrayList<InventoryItem>> goods) {
        this.goods = goods;
    }

    public HashMap<String, ArrayList<InventoryItem>> getGoods() {
        return goods;
    }
}

@JsonSerialize
class InventoryItem {
    private final String product;
    private final int available;

    public InventoryItem(@JsonProperty("product") String product, @JsonProperty("available") int available) {
        this.product = product;
        this.available = available;
    }

    public String getProduct() {
        return product;
    }

    public int getAvailable() {
        return available;
    }
}

答案 2 :(得分:0)

我发现这个google library非常强大,可用于解析JSON中的嵌套对象。

List<String> products = JsonPath.read(json, "$.goods.NY Store[*].product");

这将返回每个“NY Store”列表中所有产品的列表。

答案 3 :(得分:0)

    //import java.util.ArrayList;
    //import org.bson.Document;

    Document root = Document.parse("{\n"
            + "   \"goods\":{\n"
            + "      \"NY Store\":[\n"
            + "         {\n"
            + "            \"product\":\"Teddybear\",\n"
            + "            \"available\":\"20\"\n"
            + "         },\n"
            + "         {\n"
            + "            \"product\":\"Mountain bike\",\n"
            + "            \"available\":\"0\"\n"
            + "         }]}}");

    System.out.println(((String) ((Document) ((ArrayList) ((Document) root.get("goods")).get("NY Store")).get(0)).get("product")));
    System.out.println(((String) ((Document) ((ArrayList) ((Document) root.get("goods")).get("NY Store")).get(0)).get("available")));
    System.out.println(((String) ((Document) ((ArrayList) ((Document) root.get("goods")).get("NY Store")).get(1)).get("product")));
    System.out.println(((String) ((Document) ((ArrayList) ((Document) root.get("goods")).get("NY Store")).get(1)).get("available")));