プログラムで Chrome のブックマーク ファイルにブックマークを追加しようとしています。これは JSON 形式で保存されており、JSON.Net を使用してデステラル化しています。役立つ場合は、これを滅菌解除するために使用するコードを次に示します。各ブックマークが読み取られると、Bookmark クラスに保存されます。
public class Bookmark
{
public string url { get; set; }
public string title { get; set; }
public string browser { get; set; }
public DateTime added { get; set; }
public string fullPath { get; set; }
public object currentPath { get; set; }
public Bookmark(string url, string title, string browser, DateTime added, string fullPath, object currentPath = null)
{
this.url = url;
this.title = title;
this.browser = browser;
this.added = added;
this.fullPath = fullPath;
this.currentPath = currentPath;
}
ここで、ブックマークを殺菌して Chrome のブックマーク ファイルに保存しようとすると、問題が発生します。これを除菌しようとすると、リストに関する問題が発生します。私のクラスでは、各フォルダーは子として 1 つの URL またはフォルダーしか持てませんが、それをどのように実装するかはわかりません。また、これが機能するには、現在のフォルダーをチェックして最後のフォルダーと同じかどうかを確認する方法が必要であると考えていますが、これがどのように機能するかはわかりません.
予想される出力は次のとおりです。
"children": [ {
"children": [ {
"children": [ {
"date_added": "12995911618983970",
"id": "8",
"name": "NestedNestedURL",
"type": "url",
"url": "http://url.com/"
} ],
"date_added": "12995911579845538",
"date_modified": "12995911618983970",
"id": "5",
"name": "NestedNestedFolder",
"type": "folder"
}, {
"date_added": "12995911609609970",
"id": "7",
"name": "NestedURL",
"type": "url",
"url": "http://url.com/"
} ],
"date_added": "12995911570603538",
"date_modified": "12995911609609970",
"id": "4",
"name": "NestedFolder",
"type": "folder"
}, {
"children": [ {
"date_added": "12995911631570970",
"id": "9",
"name": "NestedURL2",
"type": "url",
"url": "http://url.com/"
} ],
"date_added": "12995911589790970",
"date_modified": "12995911631570970",
"id": "6",
"name": "NestedFolder2",
"type": "folder"
}
そして、現在のコードで受け取った誤った出力は次のとおりです。
"children": [
{
"children": {
"date_added": 12995893609609970,
"id": 0,
"name": "NestedURL",
"type": "url",
"url": "http://url.com/"
},
"date_added": 12995893609609970,
"date_modified": 0,
"id": 0,
"name": "NestedFolder",
"type": "folder"
},
{
"children": {
"date_added": 12995893618983970,
"id": 1,
"name": "NestedNestedURL",
"type": "url",
"url": "http://url.com/"
},
"date_added": 12995893618983970,
"date_modified": 0,
"id": 1,
"name": "NestedFolder",
"type": "folder"
},
{
"children": {
"date_added": 12995893631570970,
"id": 2,
"name": "NestedURL2",
"type": "url",
"url": "http://url.com/"
},
"date_added": 12995893631570970,
"date_modified": 0,
"id": 2,
"name": "NestedFolder2",
"type": "folder"
}
私はこのコードを使用しています: すべてのクラスは JSON 滅菌用です。私が言ったように、Folder クラスで何かを変更する必要があると思います。
public void Sync()
{
Browser browser = new Chrome();
SortableBindingList<Bookmark> marks = browser.ReturnBookmarks();
SortableBindingList<object> newmarks = new SortableBindingList<object>();
int count = 0;
newmarks.Add(new json_top());
json_top top = newmarks[0] as json_top;
top.roots = new json_root();
List<object> roots = new List<object>();
Folder bookmarks_bar = new Folder();
Folder other = new Folder();
List<Object> barlist = new List<Object>();
List<object> otherlist = new List<object>();
List<object> children = new List<object>();
List<string> existingFolders = new List<string>();
bookmarks_bar.date_added = ToChromeTime(marks[0].added);
bookmarks_bar.name = "Bookmarks bar";
other.date_added = ToChromeTime(marks[0].added);
other.name = "Other bookmarks";
bool isBookmarkBar = true;
Folder folder = new Folder();
foreach (Bookmark mark in ordered)
{
List<string> fullpathlist = mark.fullPath.Split('\\').ToList();
int count1 = 0;
if (currentPath != mark.fullPath)
{
folder = (createFolder(fullpathlist, fullpathlist[0], mark));
folder.children = (setChild(fullpathlist, folder, mark, 1));
count++;
}
json_URL u = new json_URL();
u.date_added = ToChromeTime(mark.added);
u.id = id;
u.name = mark.title;
u.url = mark.url;
folder.children=(u);
if(isBookmarkBar)
barlist.Add(folder);
else
{
otherlist.Add(folder);
}
}
bookmarks_bar.children = barlist;
other.children = otherlist;
top.roots.bookmark_bar = (bookmarks_bar);
top.roots.other = other;
string json = JsonConvert.SerializeObject(newmarks, Formatting.Indented);
File.WriteAllText(@"c:\person.json", json);
}
Folder setChild(List<string> fullPathList, Folder parent, Bookmark mark, int count )
{
if (count < fullPathList.Count)
{
Folder child = new Folder();
child.date_added = ToChromeTime(mark.added);
child.id = id;
child.name = fullPathList[count];
Folder LIST = setChild(fullPathList, child, mark, count + 1);
child.children= LIST;
return child;
}
}
class json_root
{
public Folder bookmark_bar { get; set; }
public Folder other { get; set; }
}
class json_top
{
public string checksum { get { return ""; } }
public json_root roots { get; set; }
public int version { get { return 1; } }
}
class json_URL : folderAndURL
{
public long date_added { get; set; }
public int id { get; set; }
public string name { get; set; }
public string type { get { return "url"; } }
public string url { get; set; }
}
public class Folder
{
public object children { get; set; }
public long date_added { get; set; }
public long date_modified
{
get { return 0; }
}
public int id { get; set; }
public string name { get; set; }
public string type
{
get { return "folder"; }
}
}
Chrome がブックマーク ファイルを正しく読み取れるように、出力を入力と一致させるための支援が必要です。
ありがとう!