我正在尝试使用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
}
}
我很乐意考虑更改任何对象的形状,或者使用不同的序列化库
借助一些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
}
}
这:
"Merseyside": 5.0
在我看来,这类似于Dictionary
中的一个条目,您可以从这种方式的实验中获得一些里程。
然而,示例JSON看起来完全合理。考虑到你有客户在使用它,我可能不会担心串行化,当然也会小心牺牲你的对象模型来反映所需的串行化(尤其是考虑到它看起来合法且易于解析)。请注意,如果您更改序列号,您的客户端必须能够成功解析该序列号。
如果您要修改JSON输出,而不是破坏您的对象模型,我会隔离这种更改——将TaxBand
对象复制到TaxBandJson
对象或类似对象中。