【问题标题】:How to extract certain JSON data in Java如何在 Java 中提取某些 JSON 数据
【发布时间】:2018-01-28 21:18:12
【问题描述】:

我有以下 JSON 文件:

{
    "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"
                    }
            } ]
    }

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

目前为止

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

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

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

Object obj = parser.parse(new FileReader("\\testdata.json"));

为什么找不到文件?我使用文件完整路径的解决方案可行,但这可能会在运行时发生变化,因此不适合。

【问题讨论】:

  • 前导反斜杠是指根目录。试着把它排除在外。另外,你被困在多远了?
  • 从您的问题中也不清楚您使用的是哪个 JSON 库。
  • 抱歉,我使用的是简单的 JSON 库。我被困在获取具体信息的下一步,例如“公司名称”和“客户”的“名称”。
  • 省略前导反斜杠会导致 java.io.FileNotFoundException: testdata.json (The system cannot find the file specified) error
  • 只是想知道您的问题是否在于查找路径文件?还是读取每个单独的元素,如姓名、电子邮件、电话等?

标签: java arrays json file


【解决方案1】:

从简单的 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); 

在这种情况下,您可以再次使用project.get("company name"); 查询JSONObject

如果您有给定对象的 POJO,则该库可能还支持使用以下方式对 POJO 进行反序列化:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多