Синтаксис Object Initializer для получения правильного Json
Вопрос
Я пытаюсь использовать 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