2008-10-08 10 views
0

J'essaie d'utiliser linq pour transformer une liste de données en une forme particulière à renvoyer en tant que Json à partir d'un appel ajax.Syntaxe d'initialisation d'objet pour produire un fichier JSON correct

Compte tenu de ces données:

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

Et ce code: ** Ce qui est pas correct et est ce qui doit être corrigé !! **

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

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

Je voudrais desiredResult être:

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

mais il est actuellement:

{ "c" : "One" },{ "c" : "Two" }, etc.

Un problème est que sur le côté gauche de la objet initialiseur je veux la valeur de c, pas c lui-même ...

Répondre

1

Solution proposée pour la correction et non pour la performance.

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

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

En json, le "c" dans "c": "One" est le nom de la propriété. Et dans le monde C#, vous ne pouvez pas créer des noms de propriété à la volée (en ignorant System.ComponentModel). Fondamentalement, je ne pense pas que vous pouvez faire ce que vous voulez.

0

Je réponds à cette vieille question simplement parce que toutes les autres réponses sont fondamentalement fausses ou incomplètes.

JSON est vraiment simple, donc en gros, pour obtenir le JSON que vous voulez, vous devez saisir simplement la différence entre les tableaux JSON:

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

et objets JSON/dictionnaires (objets et dictionnaires sont vraiment les mêmes):

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

Veuillez noter que l'élément "c" est de type différent, mais ce n'est pas un problème pour Javascript. Etant donné cela, presque tous les sérialiseurs que j'utilise sous .NET (qui est presque toujours la grande bibliothèque JSON.NET) convertit les objets .NET ou les dictionnaires .NET en objets JSON.

Vous avez donc besoin de convertir une liste en dictionnaire, puis de lier le sérialiseur à un dictionnaire ou à un objet. Une autre question est pourquoi vous voudriez avoir un dictionnaire avec la valeur égale à la clé, mais j'accepterai ce point même si je suis assez douteux.

Exemple donné:

 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