我正在尝试使用json.net
序列化一组对象该对象如下所示:
public class TaxBand
{
public TaxBand(string county, decimal taxPercentage)
{
County = county;
Tax = taxPercentage;
}
public string County { get; private set; }
public decimal Tax { get; private set; }
}
它们包含在这样的结构中:
var data = new Dictionary<string, List<TaxBand>>();
data = PopulateDataset();
string json = JsonConvert.SerializeObject(data, Formatting.Indented);
这会生成如下所示的json:
{
"North": [
{
"County": "Merseyside",
"Tax": 5.0
},
{
"County": "Greater Manchester",
"Tax": 6.0
}
],
"South": [
{
"County": "Greater London",
"Tax": 5.5
},
{
"County": "Surry",
"Tax": 6.2
}
]
}
是否可以生成如下所示的json:
{
"North":
{
"Merseyside": 5.0,
"Greater Manchester" : 6.0
},
"South":
{
"Greater London": 5.5,
"Surry": 6.2
}
}
很高兴考虑更改任何对象的形状,或者确实使用不同的序列化库
答案 0 :(得分:9)
在Linq的帮助下
var data = new Dictionary<string, List<TaxBand>>();
data = PopulateDataset();
var data2 = data.ToDictionary(kv => kv.Key,
kv => kv.Value.ToDictionary(t=>t.County,t=>t.Tax) );
var s = JsonConvert.SerializeObject(data2,Newtonsoft.Json.Formatting.Indented);
输出:
{
"North": {
"Merseyside": 5.0,
"Greater Manchester": 6.0
},
"South": {
"Greater London": 5.5,
"Surry": 6.2
}
}
答案 1 :(得分:1)
此:
"Merseyside": 5.0
在我看来类似于Dictionary
中的单个条目,你可能会以这种方式进行实验。
然而,示例JSON看起来完全合理。鉴于您有客户端使用此功能,我可能不会担心序列化,并且肯定会担心会损害您的对象模型以反映所需的序列化(特别是考虑到它看起来合法且易于解析)。请注意,如果您更改序列号,则客户必须能够成功解析它。
如果您要修改JSON输出,而不是破坏对象模型,我会隔离该更改 - 将您的TaxBand
对象复制到TaxBandJson
对象或类似对象。