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
    }
}

オブジェクトの形状を変更することを検討するか、実際に別のシリアル化ライブラリを使用してください。

4

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
  }
}
于 2012-08-02T10:10:42.540 に答える
1

これ:

"Merseyside": 5.0

私にはaの単一のエントリに似ておりDictionary、その方法で実験することである程度のマイレージが得られる可能性があります。

ただし、JSONの例は完全に合理的に見えます。クライアントがこれを消費していることを考えると、シリアル化について心配する必要はなく、目的のシリアル化を反映するためにオブジェクトモデルを危険にさらすことには注意が必要です(特に、正当で解析しやすいように見える場合)。シリアル化を変更する場合、クライアントはこれを正常に解析できる必要があることに注意してください。

オブジェクトモデルを危険にさらすのではなく、JSON出力を変更する場合は、その変更を分離します。TaxBandオブジェクトをTaxBandJsonオブジェクトなどにコピーします。

于 2012-08-02T09:55:12.440 に答える