Синтаксис Object Initializer для получения правильного Json

StackOverflow https://stackoverflow.com/questions/180930

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать 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();

Я бы хотел, чтобы wantedResult был:

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

но это в настоящее время:

{" c " : "Один" }, {" c " : "Два" } и т. д.

Одна проблема заключается в том, что в левой части инициализатора объекта мне нужно значение c , а не самого c ...

Это было полезно?

Решение

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

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

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

Другие советы

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

В принципе, я не думаю, что вы можете делать то, что хотите.

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

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top