我需要得到:
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:
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对象!
答案 0 :(得分: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"
}
]
]
}
就您的第二个示例而言,您正在创建一个包含动态对象的动态对象,并且每个对象的字段都是提供键值的。
所以,我建议放弃List<>
周围的Dictionary<string,string>
外部,然后在进行序列化时使用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"
}
}