【问题标题】:Parsing Chrome Bookmarks Json file : Java解析 Chrome 书签 Json 文件:Java
【发布时间】:2016-11-30 11:19:04
【问题描述】:

目前我正在使用 netbeans IDE。我尝试使用其他解决方案,但到目前为止没有运气。

问题是,我在尝试从谷歌 Chrome 书签文件 (C:\Users\Admin\AppData\Local\Google\Chrome\User Data \默认\书签)

p/s:虽然Bookmarks名称中没有写文件类型,但其内容已被称为JSON

这是 Bookmarks.json 里面的内容:

{
   "checksum": "20fdfad51db6d3199f8a09c3220dd93b",
   "roots": {
      "bookmark_bar": {
         "children": [ {
            "date_added": "13124893413824227",
            "id": "6",
            "name": "YouTube",
            "type": "url",
            "url": "https://www.youtube.com/"
         }, {
            "date_added": "13124893435163243",
            "id": "7",
            "name": "Welcome to Facebook",
            "type": "url",
            "url": "https://www.facebook.com/"
         } ],
         "date_added": "13124893381424539",
         "date_modified": "13124893435163243",
         "id": "1",
         "name": "Bookmarks bar",
         "type": "folder"
      },
      "other": {
         "children": [  ],
         "date_added": "13124893381424547",
         "date_modified": "0",
         "id": "2",
         "name": "Other bookmarks",
         "type": "folder"
      },
      "synced": {
         "children": [  ],
         "date_added": "13124893381424550",
         "date_modified": "0",
         "id": "3",
         "name": "Mobile bookmarks",
         "type": "folder"
      }
   },
   "version": 1
}

这是我的代码(JsonParser.java):

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParser{
    private static String jsonFile = "C:\\Users\\Admin\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Bookmarks";

    public static void main (String[] args) {

        try {
            FileReader reader = new FileReader (jsonFile); //access the file
            JSONObject jsonObject = (JSONObject) new JSONParser().parse(reader);

                      String c =(String) jsonObject.get("checksum"); //place
            //        String r =(String) jsonObject.get("roots"); //place

           //   String r =(String) jsonObject.get("children"); //place


                        System.out.println("check: " + c);
                        //System.out.println("roots: " + r);
                       JSONArray lang = (JSONArray) jsonObject.get("roots"); 
            for (int i=0; i<lang.size(); i++) {
            System.out.println ("Url Name : " + lang.get(i)+"\n");
            }       //data in the array
            }  catch (FileNotFoundException e) {
                                e.printStackTrace();
                    } catch (IOException e) {
                                e.printStackTrace();
                    } catch (ParseException e) {
                                e.printStackTrace();
                    }
    }
}

由于某种原因,当我运行代码时,这些是我得到的错误:

check: 4d55f8a0888f7dd918a702eda2821ccd
Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to org.json.simple.JSONArray
at JsonParser.main(JsonParser.java:28)
C:\Users\Admin\Documents\NetBeansProjects\Keep-It\nbproject\build-impl.xml:1051: The following error occurred while executing this line:
C:\Users\Admin\Documents\NetBeansProjects\Keep-It\nbproject\build-impl.xml:805: Java returned: 1
BUILD FAILED (total time: 2 seconds)

如您所见,只有 checksum 成功被读取,但 roots 失败并发出这些错误。

您还应该注意到,我将一些代码设置为 cmets,这些都是我尝试过但仍然出现错误的代码。

我希望任何人都可以帮助我完成这些工作。 非常感谢您的帮助

【问题讨论】:

  • Bookmarks.json 中的 roots 节点实际上是 JSONObject,因为它的值包含在 {} 括号中。仅当节点的值包含在 [] 方括号中时,您才能将节点转换为 JSONArray。

标签: java json google-chrome parsing netbeans


【解决方案1】:

问题是,你不能像(JSONArray) jsonObject.get("roots");那样将对象转换为数组,你必须遵循结构,所以根据对象和数组进行解析,如下所示

 JSONObject jsonObject = (JSONObject) new JSONParser().parse(reader);
 String checksum =jsonObject.optString("checksum");

 //  get root object
 JSONObject root = jsonObject.getJSONObject("roots");

 //  get root bookmarks object from root
 JSONObject bookmarks = root.getJSONObject("bookmark_bar");

 //  get root children array from bookmarks 
 JSONArray  childrens = bookmarks.getJSONArray("children");

 JSONObject temp ;
  for (int i=0; i<childrens.size(); i++) {
      // get object using index from childrens array
      temp = childrens.getJSONObject(i);

      // get url
      String url = temp.optString("url");
  }

随着你的结构遵循

JObject => root 
               root  JSONObject has : bookmark_bar JSONObject 
               bookmark_bar JSONObject has  : children JSONArray
               children JSONArray has JSONObject which further has String: url

【讨论】:

  • 是的,我刚刚解决了这个问题。通过将数组和对象更改为成比例的,我解决了它。其他人的建议也很有用,和你的一样,但是你这样详细,我更容易理解。
  • @user7288944 解决问题的具体更改是什么。我收到了与您指定的相同的错误。我已尝试进行 Pavneet Singh 建议的更改,但无法编译。
  • Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to org.json.simple.JSONArray at javaTools.JsonParser.main(JsonParser.java:27)
  • @L.D.James 你确定你使用的是这个确切的行代码JSONObject jsonObject = (JSONObject) new JSONParser().parse(reader);
  • 我在系统上有一个类似的问题。给我一秒钟找到它。
【解决方案2】:

roots 不是 JSONArray 而是 JSONObject。

所以你要做的就是

JSONObject lang = jsonObject.get("roots"); 

然后你也可以遍历对象中的所有键:

  • 书签栏
  • 其他
  • 已同步

【讨论】:

    【解决方案3】:

    在我看来,“根”不是一个数组,而是查看 JSON 时的一个对象。然而,“bookmark_bar”下的“children”是一个数组

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2012-02-14
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多