web-dev-qa-db-fra.com

Sérialiser le dictionnaire .NET <chaîne, chaîne> en objet paire de valeurs clés JSON

J'ai besoin d'avoir:

public class Package
{
    public Package()
    {
        name = "";
        type = new List<Dictionary<string, string>>();
    }

    public string name { get; set; }
    public List<Dictionary<string, string>> type { get; set; }
}

dans:

{
    "name":"package_name",
    "type":
    {
        "http://random.url.as.key":"random/value"
    }
}

avec:

Package package = new Package();
package.name = "package_name";
package.type.Add(new Dictionary<string, string>() { { "http://random.url.as.key", "random/value" } });

Je reçois:

{
    "name":"package_name",
    "type":
    [
        [
            {
                "Key":"http:\/\/random.url.as.key",
                "Value":"random\/value"
            }
        ]
    ]
}

tandis que, avec:

var package = new
{
    name = "package_name",
    type = new
    {
        http_random_url_as_key = "random/value"
    }
};

Je reçois:

{
    "name":"package_name",
    "type":
    {
        "http_random_url_as_key":"random/value"
    }
}

Je ne peux pas obtenir l'obsession http: //random.url.as.key dont j'ai besoin. J'ai essayé d'utiliser JavaScriptSerializer, DataContractJsonSerializer, et Convertisseur personnalisé pour Json.NET, tous avec un succès/des lacunes limités.

Il doit y avoir un meilleur moyen/quelque chose que je néglige pour obtenir un simple objet JSON sur le fil!

29
Carl Sagan

Eh bien, tout d'abord, pour le premier exemple, ce que vous avez essentiellement est une liste de collections de KeyValuePair<string,string> objets.

Ainsi, la raison pour laquelle il est converti en JSON est la suivante:

{
    "name":"package_name",
    "type":
    [ // List<Dictionary<string,string>>
        [ // Dictionary<string,string>, a list of KeyValuePair<string,string> objects
            { // KeyValuePair<string,string> object 
                "Key":"http:\/\/random.url.as.key",
                "Value":"random\/value"
            }
        ]
    ]
}

En ce qui concerne votre deuxième exemple, vous créez un objet dynamique, contenant un objet dynamique, et chacun des champs de l'objet fournit la valeur de clé.

Donc, je suggère d'abandonner l'extérieur List<> autour du Dictionary<string,string>, puis utilisez le Newtonsoft.Json.Converters.KeyValuePairConverter objet dans la bibliothèque JSON.Net lors de votre sérialisation:

string json = JsonConvert.SerializeObject( package, new KeyValuePairConverter( ) );

J'espère que cela pourra aider.

MODIFIER

D'accord, je me suis dit que je devrais donner un exemple plus concret

public class Package
{
    public Package()
    {
        name = "";
        type = new Dictionary<string, string>();
    }

    public string name { get; set; }
    public Dictionary<string, string> type { get; set; }
}

Package package = new Package();
package.name = "package_name";
package.type.Add("http://random.url.as.key", "random/value");
string json = JsonConvert.SerializeObject( package, new KeyValuePairConverter( ) );

Cela vous donnera la sortie

{
    "name":"package_name",
    "type":
    {
        "http://random.url.as.key":"random/value"
    }
}
47
Joseph Alcorn