将 JSON 字符串转换为有意义的完整数据以进行解析
Posted
技术标签:
【中文标题】将 JSON 字符串转换为有意义的完整数据以进行解析【英文标题】:Convert JSON string into meaning full data to parse 【发布时间】:2013-10-11 14:33:02 【问题描述】:好的,所以我有这个字符串:
["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
这甚至可以用正则表达式实现
为了让你更好地理解,为什么我问你这个。我有一个树结构 这里:
演示: http://jsbin.com/UXIpAHU/3/edit
我希望能够解析输出并将其保存到具有 2 列的 sql 数据库中
ID 列包含所有项目的所有 ID,但只有子 ID 或有父 ID 才会有 parentID。所以根据 DEMO 的 sql 表应该是这样的:
ID | ParentID
------------------------
1 NULL
2 NULL
3 2
4 2
5 4
6 5
7 2
实现这一目标的最佳方法是什么,我正在为我的问题寻找一些想法/解决方案。谢谢。
【问题讨论】:
这个字符串可以解析为JSON对象来获取我想要的数据吗? 不是没有修改一下 -->
应该是什么意思,它的范围在哪里结束?
如果您查看问题中的演示链接并查看函数 CreateSerOutput() 我在其中创建字符串,如果您希望能够支持 JSON,可以对其进行修改?但我对 JSON 的工作原理不是很熟悉......
@PinnyM 我已根据我所知的 JSON 标准以及我的问题中的字符串更新了我在 DEMO url 中的代码:jsbin.com/UXIpAHU/3/edit 以支持 JSON。新格式是否适用于 JSON?
提问时请注意XY Problem。最好不要将你的目标与你的下意识解决方案混为一谈。首先解释你的背景和你想要完成的事情——这是你问题的核心。然后解释到目前为止您已经尝试过什么或您正在考虑尝试什么 - 这对回答者有帮助,但不是核心问题的一部分。正则表达式从未真正与您的问题相关。
【参考方案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");
【讨论】:
为什么不应该使用 JSON 作为传输协议?毕竟它已经存在了,而且得到了很好的支持…… @PinnyM 没有理由不能。我只是觉得 XML 好用。 @PinnyM 你有办法让我使用 JSON 解析我的字符串以提取数据,因为这不需要对我现有的功能进行任何代码更改。 @PrakashChennupati 如果您最终编写了 XML,这里有一个使用 javascript 的指南:codeproject.com/Articles/12504/Writing-XML-using-JavaScript @ChuckSavage 啊酷,我试试看 XML 版本是否对我有帮助【参考方案2】:您可以将其反序列化为一个类,然后轻松地从那里提取数据。
注意 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();
【讨论】:
@PrakashChennupati GUID 只是一个字符串 所以我将返回类型更改为字符串,但是当我使用反序列化说无法将类型 system.string 转换为类型 system.Collections.Generic.List 这是我的字符串 json = "[ \"id\":21a6022f-ee6d-458f-9d6d-53e655ea5200,\"id\":c2145bb7-f753-412f-a950-4d31c4dd2de3,\"id\":0660b2e6-df96-4090-b087 -c7c67fd8dddb,\"id\":0b129f2f-32ef-4094-9940-e040efb45b06]" 你的 json 看起来不对,GUID 不是标准类型,它必须用引号引起来。此外,您始终可以使用 System.GUID 而不是字符串【参考方案3】:使用Json.NET,您可以简单地传递您的字符串以获得JObjects的JArray:
JArray arr = JArray.Parse(yourString)
然后,您可以像在任何支持 LINQ 的集合上一样使用 LINQ。
【讨论】:
以上是关于将 JSON 字符串转换为有意义的完整数据以进行解析的主要内容,如果未能解决你的问题,请参考以下文章