好的,我有点卡在这里。我可以获取查询并将数据作为XML返回。那不是问题。
我可以创建一个XDocument。那不是问题。
我希望能够做的就是转换我的XML:
<DATA>
<row>
<PersonName>Hank Scorpio</PersonName>
</row>
<row>
<PersonName>Sgt. Pepper</PersonName>
</row>
<row>
<PersonName>Dr. Sheldon Cooper</PersonName>
</row>
</DATA>
进入JSON。我尝试使用字典,如下所示:
var d = xdoc.Descendants("row")
.ToDictionary(val => val.Element("PersonName").Name.LocalName, val => val.Element("PersonName").Value);
但是这一直给我一个重复的值错误。
然后我考虑使用字符串列表而不是字典。不过,我有点不愿意这样做。
我只有1189条记录可以做,但我担心如果它增长太多,即使有一个列表的给定容量,也可能不是最佳方式。
所以基本上我想把上面的XML变成这样的东西:
{
"DATA": {
"row": [
{ "PersonName": "Hank Scorpio" },
{ "PersonName": "Sgt. Pepper" },
{ "PersonName": "Dr. Sheldon Cooper" }
]
}
}
或者,为了省去一些冲突,我应该继续做清单吗?对于我正在构建此应用程序的应用程序,我将值发送给API,但他们目前正在决定是否还需要记录的ID。因此,我试图找出一个解决方案,如果他们以后改变主意,就不会需要大量的重写。
我们正在使用VS2015,所以我不认为我们有一些较新的C#功能。
有什么想法或想法吗?
答案 0 :(得分:0)
在您的代码中,您尝试将所有单个行的内容转换为单个字典。这不起作用,因为所有xml行内容都具有相同的键“PersonName”,而字典键必须是唯一的。
您真正想要做的是将每个xml行转换为自己的字典,然后将这些字典放入列表中。这基本上就是你想要的JSON代表的东西,以及几个包装器对象。
考虑到这一点,以下是将XML转换为所需JSON的方法:
var xdoc = XDocument.Parse(xml);
var obj = new
{
DATA = new
{
row = xdoc.Root
.Elements("row")
.Select(r => r.Elements()
.ToDictionary(el => el.Name.LocalName,
el => el.Value))
.ToList()
}
};
JavaScriptSerializer jss = new JavaScriptSerializer();
string json = jss.Serialize(obj);
答案 1 :(得分:0)
这是我用来获取序列化JSON的原因:
var xdoc = XDocument.Parse(queryResult, LoadOptions.PreserveWhitespace);
var elementList = xdoc.Descendants("row").Select(r => new
{
PersonID = r.Element("PersonID").Value,
PersonName = r.Element("PersonName").Value
}).Distinct().ToList();
jsonResult = new JavaScriptSerializer().Serialize(elementList);
我的反序列化看起来像这样:
dynamic deserializedJson = new JavaScriptSerializer().Deserialize<dynamic>(result);
我按照这样迭代:
foreach (Dictionary<string, object> d in deserializedJson)
{
Console.WriteLine(d["PersonName"]);
}