Синтаксис Object Initializer для получения правильного Json - PullRequest
0 голосов
/ 08 октября 2008

Я пытаюсь использовать linq для преобразования списка данных в конкретную форму, которая будет возвращена как Json из вызова ajax.

Учитывая эти данные:

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 ]

1 голос
/ 08 октября 2008

Решение предлагается для правильности, а не производительности.

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

        string result =
            "{ "
            +
            string.Join(", ", data
              .Select(c => @"""" + c + @""": """ + c + @"""")
              .ToArray()
            ) + " }";
1 голос
/ 09 октября 2008

Как насчет использования JSON.NET ?

1 голос
/ 08 октября 2008

В json "c" в "c": "One" - это имя свойства. А в мире C # вы не можете создавать имена свойств на лету (игнорируя System.ComponentModel).

По сути, я не думаю, что вы можете делать то, что хотите.

0 голосов
/ 26 сентября 2013

Я отвечаю на этот старый вопрос только потому, что все остальные ответы в основном неправильные или неполные.

JSON действительно прост, поэтому, чтобы получить JSON, который вам нужен, вам нужно понять разницу между массивами JSON:

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

и объекты / словари JSON (объекты и словари действительно одинаковы):

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

Обратите внимание, что элемент "c" имеет другой тип, но это не проблема для Javascript.

Учитывая это, почти каждый сериализатор, который я использую в .NET (который почти всегда является отличной библиотекой JSON.NET ), преобразует объекты .NET или словари .NET в объекты JSON.

Итак, вам нужно преобразовать список в словарь, а затем передать в сериализатор словарь или объект. Другой вопрос: почему вы хотели бы иметь словарь со значением, равным ключу, но я приму этот момент, даже если я весьма сомнителен.

Пример:

        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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...