【问题标题】:Serialize .NET Dictionary<string, string> into JSON Key Value Pair Object将 .NET Dictionary<string, string> 序列化为 JSON 键值对对象
【发布时间】:2011-07-04 17:42:22
【问题描述】:

我需要得到:

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、 用于 Json.NET 的自定义转换器,但都取得了有限的成功/缺点。

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

【问题讨论】:

  • 你用什么序列化成 JSON?
  • 你第一个 Package 类不会编译。您确定字段 typeList&lt;Dictionary&lt;string,string&gt;&gt; 吗?似乎您希望它在转换为 JSON 时像 Dictionary&lt;string,string&gt; 一样执行。
  • 使用它来将 .net 代码序列化为 JSON 并恢复。 james.newtonking.com/projects/json-net.aspx
  • 这篇文章可以帮助你解决你的问题:stackoverflow.com/a/36223340/1442180

标签: c# asp.net wcf json


【解决方案1】:

嗯,首先,对于第一个示例,您基本上拥有的是 KeyValuePair&lt;string,string&gt; 对象的集合列表。

所以,它被转换为显示的 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&lt;string,string&gt; 周围放弃外部List&lt;&gt;,然后在进行序列化时使用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 端点,这段代码如何适应?
  • KeyValuePairConverter 的使用正是我所需要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2020-05-06
相关资源
最近更新 更多