如何在Java中提取某些JSON数据

时间:2018-01-28 21:18:12

标签: java arrays json file

我有以下JSON文件:

val (x,y,z) = (Vector(1.0, 3.0, 3.0),Vector(2.0, 5.0, 1.0),Vector(5.0, 7.0, -1.0))
val p = ThreeDPlot().withScatter3D(x,y,z,ScatterOptions().copy(mode = Seq(ScatterMode.Marker)));
draw(p, "hello-plotly");

我试图获取详细信息,例如公司名称,客户名称和“Z联系人”的电子邮件地址。

到目前为止我已经

{
    "project details": [ {
            "company name": "Example company name",
            "project name": "Example project name",
            "client": {
                    "name": "Example client",
                    "email": "testing@test.com",
                    "phone": "+44 123456"
                    },
            "Z Contact" : {
                    "name": "Fred Blogs",
                    "email": "fred@z.com",
                    "phone": "+44 123456"
                    }
            } ]
    }

这将返回整个项目详细信息数据。我对如何使用Java获得每个单独的值感到困惑。

此外,我将这个JSON文件放在与读取它的类相同的包中,但是当我使用

public static void main(String[] args) {

    JSONParser parser = new JSONParser();
    try {

        Object obj = parser.parse(new FileReader("C:\\Users\\test\\Desktop\\Testing2\\src\\testdata.json"));
        JSONObject jsonObject =  (JSONObject) obj;
        JSONArray array = (JSONArray) jsonObject.get("project details");
        System.out.println(array);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

为什么无法找到该文件?我使用文件的完整路径的解决方案有效,但这可能会在运行时更改,因此不适合。

1 个答案:

答案 0 :(得分:0)

根据简单的JSON库API提供的内容,根据您的上述代码,array最后会包含以下内容:

[ 
    {
      "company name": "Example company name",
      "project name": "Example project name",
      "client": {
              "name": "Example client",
              "email": "testing@test.com",
              "phone": "+44 123456"
      },
      "Z Contact" : {
              "name": "Fred Blogs",
              "email": "fred@z.com",
              "phone": "+44 123456"
      }
    } 
]

现在我们应该能够做到以下几点:

JSONObject project = array.getJsonObject(0); 

在这种情况下,您将再次能够使用JSONObject

查询project.get("company name");

如果您拥有给定对象的POJO,那么该库也可能支持使用以下内容对POJO进行反序列化:

List<Project> project = array.getValuesAs(Project.class);

在这种情况下,您可以正常操作列表,并使用普通的setter和getter来操作对象。

请注意,IMO,如果您的JSON不是非常动态,您应该尽可能将JSON反序列化为POJO。在这种情况下,我建议使用Jackson ObjectMapper,因为它有一些非常好的功能。此外,如果您只需要查询JSON有效负载的特定部分,请查看JSONPath,这可能也会有所帮助。