[英]Issue serializing JSON Multidimensional List
I am serializing a Multidimensional list using JSON.Net, and I am having problems making it serialize correctly. 我正在使用JSON.Net序列化多维列表,但在使其正确序列化时遇到问题。
Here is the result I expected from this: 这是我期望的结果:
"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"
}
However, this is very different than the result I actually get. 但是,这与我实际得到的结果非常不同。 The issue here, I believe, is that multiple URL's can belong to a single folder, and multiple folders to one folder, but I am unsure of how to implement this.
我认为这里的问题是,多个URL可以属于一个文件夹,而多个文件夹可以属于一个文件夹,但是我不确定如何实现这一点。 Here is the code I currently use:
这是我当前使用的代码:
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.Add(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.Add(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;
}
}
public class Folder
{
public List<folderAndURL> 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"; }
}
}
And here is the output I get from that code: 这是我从该代码获得的输出:
"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"
}
So, how can I change my code to match the input and the output? 因此,如何更改代码以匹配输入和输出? Like I said, it seems to be something about multiple folders not being applied to one parent folder.
就像我说的,似乎是有关多个文件夹未应用于一个父文件夹的。
Edit: I have uploaded a full version of the code here , because I cut out some parts due to space. 编辑:我已经上传了完整版本的代码在这里 ,因为我切出一些地方由于空间。
First you assign folder.children = (setChild(fullpathlist, folder, mark, 1));
首先,您分配
folder.children = (setChild(fullpathlist, folder, mark, 1));
and a couple of lines later you overwrite that with folder.children=(u);
几行之后,您用
folder.children=(u);
覆盖了它folder.children=(u);
. 。 You'll not have the children from the recursive call in your folder object.
您的文件夹对象中将没有递归调用的子代。
I don't know if this is what you want: 我不知道这是否是您想要的:
/// <summary>
/// Load file from
/// C:\Users\XXXX\AppData\Local\Google\Chrome\User Data\Default\Bookmarks
/// </summary>
[TestFixture]
public class ChromeBookmarks
{
[Test]
public void RoundTripBookmarksTest()
{
JsonSerializer jsonSerializer = JsonSerializer.Create(
new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error,
});
RootObject rootObject;
using (JsonTextReader jsonTextReader = new JsonTextReader(new StringReader(Properties.Resources.Bookmarks))) //I added my bookmars as an embedded txt file for convenience
{
rootObject = jsonSerializer.Deserialize<RootObject>(jsonTextReader);
}
//Here you have the contents of the bookmarks file in rootObject if you need to do manipulations
StringBuilder stringBuilder = new StringBuilder();
using (JsonTextWriter jsonTextWriter = new JsonTextWriter(new StringWriter(stringBuilder)))
{
jsonTextWriter.Formatting = Formatting.Indented;
jsonTextWriter.Indentation = 3;
jsonSerializer.Serialize(jsonTextWriter, rootObject);
}
var json = stringBuilder.ToString();
File.WriteAllText(@"C:\person.json", json);
}
}
public class Child
{
[JsonProperty(PropertyName = "children")]
public List<Child> Children { get; set; }
[JsonProperty(PropertyName = "date_added")]
public string DateAdded { get; set; }
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "type")]
public string Type { get; set; }
[JsonProperty(PropertyName = "url")]
public string Url { get; set; }
[JsonProperty(PropertyName = "date_modified")]
public string DateModified { get; set; }
}
public class Roots
{
[JsonProperty(PropertyName = "bookmark_bar")]
public Child BookmarkBar { get; set; }
[JsonProperty(PropertyName = "other")]
public Child Other { get; set; }
[JsonProperty(PropertyName = "synced")]
public Child Synced { get; set; }
}
public class RootObject
{
[JsonProperty(PropertyName = "checksum")]
public string Checksum { get; set; }
[JsonProperty(PropertyName = "roots")]
public Roots Roots { get; set; }
[JsonProperty(PropertyName = "version")]
public int Version { get; set; }
}
I used this
to generate the classes, did not read the docs just passed my bookmarks so there is a chance some field is missing. 我用
this
来生成类,没有阅读刚刚通过我的书签的文档,因此有可能缺少某些字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.