Domanda

Sto tentando di utilizzare linq per modellare l'elenco di dati in una forma particolare da restituire come Json da una chiamata Ajax.

Dati dati:

var data = new List<string>();
data.Add("One");
data.Add("Two");
data.Add("Three");

E questo codice: ** Che non è corretto ed è ciò che deve essere risolto !! **

var shaped = data.Select(c =>
    new { c = c }
).ToList();

serializer.Serialize(shaped,sb);
string desiredResult = sb.ToString();

Vorrei desideratoResult essere:

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

ma al momento è:

{" c " : " Uno " }, {" c " : " Due " } , ecc.

Un problema è che sul lato sinistro dell'inizializzatore dell'oggetto voglio il valore di c , non c stesso ...

È stato utile?

Soluzione

Soluzione offerta per correttezza, non per prestazioni.

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

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

Altri suggerimenti

In json, il " c " in "c" : " Uno " è il nome della proprietà. E nel mondo C #, non puoi creare nomi di proprietà al volo (ignorando System.ComponentModel).

Fondamentalmente, non penso che tu possa fare quello che vuoi.

Che dire dell'utilizzo di JSON.NET ?

Sto rispondendo a questa vecchia domanda solo perché tutte le altre risposte sono sostanzialmente sbagliate o incomplete.

JSON è davvero semplice, quindi in pratica, per ottenere il JSON che desideri, devi cogliere solo la differenza tra le matrici JSON:

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

e oggetti / dizionari JSON (oggetti e dizionari sono davvero gli stessi):

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

Nota la " c " L'elemento è di tipo diverso, ma questo non è un problema per Javascript.

Detto questo, quasi tutti i serializzatori che utilizzo sotto .NET (che è quasi sempre il grande Libreria JSON.NET ) converte gli oggetti .NET o i dizionari .NET in oggetti JSON.

Quindi è necessario convertire un elenco in un dizionario e quindi alimentare il serializzatore con un dizionario o un oggetto. Un'altra domanda è perché vorresti avere un dizionario con un valore uguale alla chiave, ma accetterò quel punto anche se sono abbastanza dubbioso.

Esempio fornito:

        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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top