Objeto sintaxe Initializer para produzir correta Json
Pergunta
Eu estou tentando usar o LINQ a lista formato de dados em uma forma particular de ser devolvido como JSON de uma chamada de ajax.
Dada esta data:
var data = new List<string>();
data.Add("One");
data.Add("Two");
data.Add("Three");
E este código: ** que não é correto e é o que precisa ser corrigido !! **
var shaped = data.Select(c =>
new { c = c }
).ToList();
serializer.Serialize(shaped,sb);
string desiredResult = sb.ToString();
Gostaria desiredResult
a ser:
{
"One": "One",
"Two": "Two",
"Three": "Three"
}
mas de momento:
{ "c" : "One" },{ "c" : "Two" }
, etc.
Um problema é que no lado esquerdo do objeto initializer Eu quero o valor de c
, não c
si ...
Solução
Solução oferecida para correção, não o desempenho.
List<string> data = new List<string>()
{
"One",
"Two",
"Three"
};
string result =
"{ "
+
string.Join(", ", data
.Select(c => @"""" + c + @""": """ + c + @"""")
.ToArray()
) + " }";
Outras dicas
Em json, o "c" em "c": "One" é o nome da propriedade. E no mundo do C #, você não pode criar nomes de propriedades na mosca (ignorando System.ComponentModel).
Basicamente, eu não acho que você pode fazer o que quiser.
Que tal usar JSON.NET ?
Eu estou respondendo a esta pergunta velha só porque todas as outras respostas são basicamente errada ou incompleta.
JSON é muito simples, então, basicamente, para obter o JSON que você quer, você precisa de compreender apenas a diferença entre matrizes JSON:
["one", "two", "three"]
e objetos JSON / dicionários (objetos e dicionários são realmente a mesma):
{"a": "one", "b": "two", "c": 3}
Por favor, note o "c" elemento é do tipo diferente, mas isso não é um problema para Javascript.
Diante disso, quase todos os serializer uso I sob .NET (que é quase sempre o grande JSON.NET biblioteca) converte objetos .NET ou o .NET dicionários para objetos JSON.
Então, o que você precisa é converter uma lista para um dicionário, e depois alimentar o serializer com um dicionário ou objeto. Outra questão é por isso que você gostaria de ter um dicionário com valor igual a chave, mas eu vou aceitar esse ponto, mesmo que eu estou bastante duvidosa.
Exemplo dada:
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