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 ...

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top