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

28

我需要获取:

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

while, with:

->

while, with:

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、以及 Json.NET 自定义转换器,但都存在限制性成功/缺陷。

肯定有更好的方法/我忽略了一些东西来通过网络获取一个简单的JSON对象!


你正在使用什么来将数据序列化为JSON格式? - Vadim
3
你的第一个Package类无法编译通过。你确定字段type是一个List<Dictionary<string,string>>吗?当转换为JSON时,它似乎想要表现得像一个Dictionary<string,string> - Cheng Chen
使用此工具将 .net 代码序列化为 JSON 并还原。http://james.newtonking.com/projects/json-net.aspx - Deepak
这篇文章可以帮助您解决问题:https://dev59.com/DpXfa4cB1Zd3GeqPem7q#36223340 - Fred
1个回答

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

就你的第二个例子而言,你正在创建一个动态对象,其中包含一个动态对象,而每个对象的字段都提供了键值。

因此,我建议在 Dictionary<string,string> 周围放弃外部的 List<>,然后在进行序列化时使用 JSON.Net 库中的 Newtonsoft.Json.Converters.KeyValuePairConverter 对象:

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

希望能对您有所帮助。

编辑

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

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

如果我想要同时拥有WCF和JSON终结点,这段代码应该如何适配? - William Niu
1
KeyValuePairConverter 的使用正是我所需要的。谢谢! - psulek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接