将.NET Dictionary <string,string>序列化为JSON键值对象

Car*_*gan 29 c# asp.net wcf 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; }
}
Run Code Online (Sandbox Code Playgroud)

成:

{
    "name":"package_name",
    "type":
    {
        "http://random.url.as.key":"random/value"
    }
}
Run Code Online (Sandbox Code Playgroud)

有:

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

我明白了:

{
    "name":"package_name",
    "type":
    [
        [
            {
                "Key":"http:\/\/random.url.as.key",
                "Value":"random\/value"
            }
        ]
    ]
}
Run Code Online (Sandbox Code Playgroud)

同时,用:

var package = new
{
    name = "package_name",
    type = new
    {
        http_random_url_as_key = "random/value"
    }
};
Run Code Online (Sandbox Code Playgroud)

我明白了:

{
    "name":"package_name",
    "type":
    {
        "http_random_url_as_key":"random/value"
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法得到我需要的http://random.url.as.key.我尝试过使用JavaScriptSerializer,DataContractJsonSerializer JZ.NET的自定义转换器,所有这些都是有限的成功/缺点.

必须有一个更好的方法/我忽略的东西,通过电线获得一个简单的JSON对象!

Jos*_*orn 47

好吧,首先,对于第一个例子,你基本上拥有的是一组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"
            }
        ]
    ]
}
Run Code Online (Sandbox Code Playgroud)

就您的第二个示例而言,您正在创建一个包含动态对象的动态对象,并且每个对象的字段都是提供键值的字段.

所以,我建议抛弃外List<>周围Dictionary<string,string>,然后利用的Newtonsoft.Json.Converters.KeyValuePairConverter对象在JSON.Net库做你的序列化时:

string json = JsonConvert.SerializeObject( package, new KeyValuePairConverter( ) );
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

编辑

好的,所以我想我应该给出一个更具体的例子

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( ) );
Run Code Online (Sandbox Code Playgroud)

这将为您提供输出

{
    "name":"package_name",
    "type":
    {
        "http://random.url.as.key":"random/value"
    }
}
Run Code Online (Sandbox Code Playgroud)