好的,所以我有这个字符串:
[{"id":1},{"id":2,"children":[{"id":3},{"id":4,"children":[{"id":5,"children":[{"id":6}]}]},{"id":7}]}]
我希望能够解析它并将其用作有意义的数据进入我的数据库。
解析后输出作为数组/或者如果您认为从中提取数据更好,则可以建议不同的输出。这只是我的想法。
[0] id:1
[1] id:2 -> id:3, id:4 -> id:5 -> id:6
[2] id:7
这甚至可以使用正则表达式
让你更好地理解,为什么我问你这个。我有一个树形结构 在这里:
DEMO: http://jsbin.com/UXIpAHU/3/edit
我希望能够解析输出并将其保存到带有2列的sql数据库中
ID列包含所有项目的所有ID,但只有子项或拥有父项的ID才会包含parentID。所以sql表看起来像基于DEMO:
ID | ParentID
------------------------
1 NULL
2 NULL
3 2
4 2
5 4
6 5
7 2
实现这一目标的最佳方式是什么,我正在为我的问题寻找一些想法/解决方案。谢谢。
答案 0 :(得分:1)
OP更改了问题,因此以下内容基于上一个问题:
如果您控制输出,则应使用XML作为传输语言。它非常简单易用,C#内置了支持。
你的结果来自:
{"id":1},{"id":2->"children":{"id":3},{"id":4->"children":{"id":5->"children":{"id":6}}},{"id":7}}
会变成:
<root>
<item id="1" />
<item id="2">
<item id="3" />
<item id="4">
<item id="5">
<item id="6" />
</item>
</item>
<item id="7" />
</item>
</root>
然后您可以阅读:
XElement root = XElement.Parse(xml); // or .Load(file)
Dictionary<int,int?> list = root.Descendants("item")
.ToDictionary(x => (int)x.Attribute("id"), x =>
{
var parentId = x.Parent.Attribute("id");
if (parentId == null)
return null;
return (int)parentId;
});
现在,您可以根据需要使用
获得键值对的字典列表ID | ParentID
------------------------
1 NULL
2 NULL
3 2
4 2
5 4
6 5
7 2
===转换回来===
Dictionary<int, int?> dic = new Dictionary<int, int?>
{
{1,null},
{2,null},
{3,2},
{4,2},
{5,4},
{6,5},
{7,2}
};
XElement root = new XElement("root");
foreach (var kvp in dic)
{
XElement node = new XElement("item", new XAttribute("id", kvp.Key));
int? parentId = kvp.Value;
if (null == parentId)
root.Add(node);
else
{
// Get first item with id of parentId
XElement parent = root.Descendants("item")
.FirstOrDefault(i => (int)i.Attribute("id") == (int)parentId);
if (null != parent) // which it shouldn't for our array
parent.Add(node);
}
}
要获取字符串,请使用:
string xml = root.ToString();
或者保存到文件:
root.Save("filepath");
答案 1 :(得分:1)
您可以将其反序列化为一个类,并从那里轻松提取数据。
请注意,System.Web.Script.Serialization.JavaScriptSerializer位于System.Web.Extensions
[Serializable()]
public class Info
{
private int _id;
private List<Info> _children;
public int Id {
get { return _id; }
set { _id = value; }
}
public List<Info> Children {
get { return _children; }
set { _children = value; }
}
}
public void Main()
{
string json = null;
List<Info> result = null;
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
json = "[{\"id\":1},{\"id\":2,\"children\":[{\"id\":3},{\"id\":4,\"children\":[{\"id\":5,\"children\":[{\"id\":6}]}]},{\"id\":7}]}]";
result = ser.Deserialize<List<Info>>(json);
foreach (Info p in result) {
Console.WriteLine(p.Id);
if (p.Children != null) {
foreach (Info c in p.Children) {
Console.WriteLine(" " + c.Id);
}
}
}
Console.ReadLine();
}
答案 2 :(得分:1)
使用Json.NET,您只需传入字符串即可获得JObject的JArray:
JArray arr = JArray.Parse(yourString)
然后,您可以像使用任何支持LINQ的集合一样使用LINQ。