JSON序列化格式化

3

我正在尝试使用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
    }
}

我很乐意考虑改变任何对象的形状,或者使用不同的序列化库。

2个回答

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

这个:

"Merseyside": 5.0

对我来说,这似乎类似于字典中的单个条目,您可以通过尝试这种方式获得一些收益。

然而,示例JSON看起来完全合理。鉴于您有客户在使用此内容,我可能不会担心序列化,并且肯定会谨慎地避免损害对象模型以反映所需的序列化(特别是考虑到它看起来合法且易于解析)。请注意,如果更改序列化,则必须确保您的客户端能够成功解析此内容。

如果要修改JSON输出而不是妥协您的对象模型,我建议将该更改隔离-将您的TaxBand对象复制到一个TaxBandJson对象中或类似对象中。


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