SQL Server XML结果,使用C#和JavaScriptSerializer()转换为JSON?

时间:2017-11-21 19:18:16

标签: c# json list dictionary javascriptserializer

好的,我有点卡在这里。我可以获取查询并将数据作为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#功能。

有什么想法或想法吗?

2 个答案:

答案 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"]);
            }