web-dev-qa-db-fra.com

Création d'un tableau JSON en C #

Ok, j’essaie donc d’envoyer des commandes POST via une connexion http, et d’utiliser le format JSON pour le faire. J'écris le programme pour le faire en C #, et je me demandais comment formaterais-je un tableau de valeurs à transmettre en tant que JSON au serveur.

Actuellement j'ai ceci:

new {name = "command" , index = "X", optional = "0"}

Ce qui se traduit en JSON:

"name": "command",
"index": "X",
"optional": "0"

Et je veux faire un tableau, appelé items, où chaque élément contient ces trois valeurs. Donc, ce serait essentiellement un tableau d'objets, dans lequel l'objet contient un nom, un index et un champ optionnel.

J'imaginais que cela ressemblerait à ceci:

new {items = [(name = "command" , index = "X", optional = "0"), 
              (name = "status" , index = "X", optional = "0")]}

Ce qui, si c'était une syntaxe correcte, se traduirait par ceci en JSON:

"items": 
[
    {
        "name": "command",
        "index": "X",
        "optional": "0"
    },
    {
        "name": "status",
        "index": "X",
        "optional": "0"
    }
]

Mais, évidemment, je me trompe. Des idées? Toute aide est appréciée.

56
Nealon

Tu es proche. Cela devrait faire l'affaire:

new {items = new [] {
    new {name = "command" , index = "X", optional = "0"}, 
    new {name = "command" , index = "X", optional = "0"}
}}

Si votre source était énumérable, vous voudrez peut-être faire ceci:

new {items = source.Select(item => new 
{
    name = item.Name, index = item.Index, options = item.Optional
})};
83

Vous feriez mieux de créer une classe pour chaque élément au lieu d'utiliser des objets anonymes. Et dans l'objet que vous sérialisez, vous devriez avoir un tableau de ces éléments. Par exemple.:

public class Item
{
    public string name { get; set; }
    public string index { get; set; }
    public string optional { get; set; }
}

public class RootObject
{
    public List<Item> items { get; set; }
}

Usage:

var objectToSerialize = new RootObject();
objectToSerialize.items = new List<Item> 
                          {
                             new Item { name = "test1", index = "index1" },
                             new Item { name = "test2", index = "index2" }
                          };

Et, au final, vous n'aurez pas à changer plusieurs fois si vous devez modifier la structure des données.

p.s. Voici Très bel outil pour les complexes jsons

33
Leri

En outre, avec les types anonymes (je préfère pas faire ceci) - ceci est juste une autre approche .

void Main()
{
    var x = new
    {
        items = new[]
        {
            new
            {
                name = "command", index = "X", optional = "0"
            },
            new
            {
                name = "command", index = "X", optional = "0"
            }
        }
    };
    JavaScriptSerializer js = new JavaScriptSerializer(); //system.web.extension Assembly....
    Console.WriteLine(js.Serialize(x));
}

résultat :

{"items":[{"name":"command","index":"X","optional":"0"},{"name":"command","index":"X","optional":"0"}]}

10
Royi Namir