对象初始值设定项语法以生成正确的 Json

Object Initializer syntax to produce correct Json

提问人:zadam 提问时间:10/8/2008 最后编辑:Jason Plankzadam 更新时间:12/18/2019 访问量:957

问:

我正在尝试使用 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" }等。

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

C# LINQ JSON

评论


答:

1赞 Marc Gravell 10/8/2008 #1

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

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

1赞 Amy B 10/8/2008 #2

提供的解决方案是为了正确性,而不是性能。

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

        string result =
            "{ "
            +
            string.Join(", ", data
              .Select(c => @"""" + c + @""": """ + c + @"""")
              .ToArray()
            ) + " }";
1赞 mathieu 10/9/2008 #3

使用 JSON.NET 怎么样?

1赞 Alberto Chiesa 9/26/2013 #4

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

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 应该是 , 根据格式的不同,或多或少有空格"{'a':'a', 'b':'b', 'c':'c'}"