Question

J'essaie d'utiliser linq pour transformer une liste de données en une forme particulière à renvoyer sous forme de JSON à partir d'un appel ajax.

Étant donné ces données:

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

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

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

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

Je voudrais que désiréResult soit:

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

mais il est actuellement:

{" c " : " Un " }, {" c " : " Deux " } , etc.

Un problème est que du côté gauche de l'initialiseur d'objet, je veux la valeur de c , et non de c elle-même ...

Était-ce utile?

La solution

Solution proposée pour l'exactitude et non pour les performances.

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

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

Autres conseils

Dans json, le "c" dans " c " : " Un " est le nom de la propriété. Et dans le monde C #, vous ne pouvez pas créer de noms de propriétés à la volée (en ignorant System.ComponentModel).

En gros, je ne pense pas que vous puissiez faire ce que vous voulez.

Pourquoi ne pas utiliser JSON.NET ?

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, pour obtenir le JSON souhaité, vous devez bien saisir la différence entre les tableaux JSON:

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

et objets / dictionnaires JSON (les objets et les dictionnaires sont vraiment identiques):

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

Veuillez noter le " c " L'élément est de type différent, mais ce n'est pas un problème pour Javascript.

Cela étant dit, presque tous les sérialiseurs que j'utilise sous .NET (ce qui est presque toujours le grand JSON.NET ) convertit des objets .NET ou des dictionnaires .NET en objets JSON.

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

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top