【问题标题】:Why does not read JSON file?为什么不读取 JSON 文件?
【发布时间】:2021-10-22 00:02:04
【问题描述】:

这段代码应该读取 JSON 文件,它是一个元素数组,然后它应该读取该数组的所有元素,但我得到的结果只有一行,它看起来像这样:

reviews[{"sourceId":"890cdd7974cdf8aabe6e9051f5a87303bdb933ae","logoHref":null,"reviewerId":null,"reviewCreatedOnTime":161157...

这是读取文件的代码:

FileReader read=new FileReader("C:\\Users\\User\\eclipse-workspace\\Task\\files\\reviews.json");
    JSONParser parser=new JSONParser();
    Object obj=parser.parse(read);
    JSONObject jsonObject=new JSONObject();
    jsonObject=(JSONObject) obj;
    
    JSONArray reviews = new JSONArray();
    reviews=(JSONArray) jsonObject.get("reviews");
    
    Iterator<Map.Entry> itr1 = jsonObject.entrySet().iterator();
    while (itr1.hasNext()) {
        Map.Entry pair = itr1.next();
        System.out.println(pair.getKey() + " " + pair.getValue());
    }
//json file
{
"reviews":[
  {
    "id": 2097047,
    "reviewId": "93f131be27dc1122bb7ef0048ad10e4f",
    "reviewFullText": "5 star review",
    "reviewText": "5 star review",
    "numLikes": 0,
    "numComments": 0,
    "numShares": 0,
    "rating": 5,
    "reviewCreatedOn": "2 months ago",
    "reviewCreatedOnDate": "2021-01-25T13:00:35+00:00",
    "reviewCreatedOnTime": 1611579635,
    "reviewerId": null,
    "reviewerUrl": null,
    "reviewerName": "Reviewer #20",
    "reviewerEmail": null,
    "sourceType": "custom",
    "isVerified": false,
    "source": "custom",
    "sourceName": "1-20 Reviews",
    "sourceId": "890cdd7974cdf8aabe6e9051f5a87303bdb933ae",
    "tags": [],
    "href": null,
    "logoHref": null,
    "photos": []
  },

【问题讨论】:

  • 你做过debugging吗?你发现了什么?
  • reviews[{ ... 不是有效的 JSON。文件的内容是什么样的?
  • 您的代码无法生成您显示的输出。你可以添加真正的输出吗?还要添加输入示例。
  • 这里是 json :``` { "reviews":[ { "id": 2097047, "reviewId": "93f131be27dc1122bb7ef0048ad10e4f", "reviewFullText": "5 星评论", "reviewText": “5 星评论”,“numLikes”:0,“numComments”:0,
  • 我添加了json文件,你能看到吗?

标签: java json dictionary iterator filereader


【解决方案1】:

您的第一个问题是您没有采用 reviews 对象,而是仍然引用主 json 对象。

Iterator<Map.Entry> itr1 = jsonObject.entrySet().iterator();

应该将jsonObject更改为reviews,但同时,鉴于它是JSONArray,因为你说它只是数组中的一个元素,你可以只取数组的第一个元素,即.get(0)

那么你的代码会改变如下:

Iterator<Entry> itr1 = ((JSONObject)reviews.get(0)).entrySet().iterator();
while (itr1.hasNext()) {
  Map.Entry pair = itr1.next();
  System.out.println(pair.getKey() + " " + pair.getValue());
}

你的输出是你所期望的:

sourceId 890cdd7974cdf8aabe6e9051f5a87303bdb933ae
logoHref null
reviewerId null
reviewCreatedOnTime 1611579635
isVerified false
rating 5
reviewerUrl null
reviewFullText 5 star review
source custom
numLikes 0
reviewCreatedOnDate 2021-01-25T13:00:35+00:00
photos []
tags []
numComments 0
reviewerName Reviewer #20
sourceType custom
reviewerEmail null
numShares 0
id 2097047
sourceName 1-20 Reviews
href null
reviewId 93f131be27dc1122bb7ef0048ad10e4f
reviewCreatedOn 2 months ago
reviewText 5 star review

如果您想处理所有条评论并将每条评论作为地图阅读,您可以执行以下操作:

    FileReader read = new FileReader(
        "C:\\Users\\User\\eclipse-workspace\\Task\\files\\reviews.json");
    JSONParser parser = new JSONParser();
    Object obj = parser.parse(read);
    JSONObject jsonObject = new JSONObject();
    jsonObject = (JSONObject) obj;

    JSONArray reviews = new JSONArray();
    reviews = (JSONArray) jsonObject.get("reviews");

    Iterator<Entry> itr1 = reviews.iterator();
    while (itr1.hasNext()) {

      Iterator<Entry> itr2 = ((JSONObject) itr1.next()).entrySet().iterator();
      while (itr2.hasNext()) {
        Map.Entry pair = itr2.next();
        System.out.println(pair.getKey() + " " + pair.getValue());
      }
    }

附注:我鼓励您使用更简单的方法来构建完善的库,例如 jackson 或 gson,而不是通过这种方式处理数据。

【讨论】:

  • 是的,你是对的,我可以使用库,但任务是在不使用库的情况下解决它
猜你喜欢
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多