用于生成正确Json的Object Initializer语法

时间:2008-10-08 00:19:17

标签: c# linq json

我正在尝试使用linq将数据列表整形为特定形状,以便从ajax调用返回为Json。

鉴于此数据:

var data = new List<string>();
data.Add("One");
data.Add("Two");
data.Add("Three");

这段代码:**哪个不正确,需要修复!! **

var shaped = data.Select(c =>
    new { c = c }
).ToList();

serializer.Serialize(shaped,sb);
string desiredResult = sb.ToString();

我希望desiredResult成为:

{
    "One": "One",
    "Two": "Two",
    "Three": "Three"
}

但目前是:

{ "c" : "One" },{ "c" : "Two" }

一个问题是,在对象初始值设定项的左侧,我想要c的值,而不是c本身......

4 个答案:

答案 0 :(得分:1)

在json中,“c”中的“c”:“One”是属性名称。在C#世界中,您无法动态创建属性名称(忽略System.ComponentModel)。

基本上,我认为你不能做你想做的事。

答案 1 :(得分:1)

解决方案提供正确性而非性能。

        List<string> data = new List<string>()
        {
            "One",
            "Two",
            "Three"
        };

        string result =
            "{ "
            +
            string.Join(", ", data
              .Select(c => @"""" + c + @""": """ + c + @"""")
              .ToArray()
            ) + " }";

答案 2 :(得分:1)

如何使用JSON.NET

答案 3 :(得分:0)

我正在回答这个老问题,因为所有其他答案基本上都是错误的或不完整的。

JSON非常简单,基本上,要获得所需的JSON,您需要掌握JSON数组之间的区别:

["one", "two", "three"]

和JSON对象/字典(对象和字典真的相同):

{"a": "one", "b": "two", "c": 3}

请注意“c”元素的类型不同,但这对Javascript来说不是问题。

鉴于此,我在.NET下使用的几乎所有序列化程序(几乎总是伟大的JSON.NET库)都将.NET对象或.NET字典转换为JSON对象。

所以你需要的是将List转换为Dictionary,然后用字典或对象提供序列化器。 另一个问题是为什么你想要一本价值等于钥匙的字典,但即使我很可疑,我也会接受这一点。

给出的例子:

        List<string> source = new List<string>() { "a", "b", "c" };

        Dictionary<string, string> dict = source.ToDictionary(el => el, el => el);

        var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(dict);
        // jsonString should be "{'a':'a', 'b':'b', 'c':'c'}", with more or less whitespace depending on formatting