Sintassi dell'Inizializzatore di oggetti per produrre Json corretto
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 ...
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