web-dev-qa-db-ja.com

.NET Dictionary <string、string>をJSONキー値ペアオブジェクトにシリアル化します

私は取得する必要があります:

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; }
}

に:

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

で:

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

私は得る:

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

一方、

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

私は得る:

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

わかりにくいhttp://random.url.as.keyが必要だ。 JavaScriptSerializer、DataContractJsonSerializer、and Json.NET用のカスタムコンバーターを使用してみましたが、成功/欠点は限られていました。

簡単なJSONオブジェクトをネットワーク経由で取得するには、見落とすより良い方法/何かが必要です!

29
Carl Sagan

まず、最初の例では、基本的にKeyValuePair<string,string>オブジェクトのコレクションのリストがあります。

したがって、表示されるJSONに変換される理由は次のとおりです。

{
    "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"
            }
        ]
    ]
}

2番目の例までは、動的オブジェクトを含む動的オブジェクトを作成しており、オブジェクトの各フィールドがキー値を提供しています。

ですから、List<>の周りに外側のDictionary<string,string>を捨てて、シリアル化を行うときにJSON.NetライブラリのNewtonsoft.Json.Converters.KeyValuePairConverterオブジェクトを利用することをお勧めします。

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

お役に立てば幸いです。

[〜#〜] edit [〜#〜]

さて、より具体的な例を挙げるべきだと思いました

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( ) );

これにより出力が得られます

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