【问题标题】:json serialisation formattingjson序列化格式
【发布时间】:2012-08-02 09:45:26
【问题描述】:

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

很高兴考虑更改任何对象的形状,或者确实使用不同的序列化库

【问题讨论】:

    标签: c# json serialization json.net


    【解决方案1】:

    在一些 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
      }
    }
    

    【讨论】:

      【解决方案2】:

      这个:

      "Merseyside": 5.0
      

      在我看来类似于 Dictionary 中的单个条目,您可能会通过以这种方式进行试验获得一些好处。

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

      如果您要修改 JSON 输出,而不是破坏您的对象模型,我会隔离该更改 - 将您的 TaxBand 对象复制到 TaxBandJson 对象或类似对象中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2015-11-02
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-31
        相关资源
        最近更新 更多