2012-08-02 114 views
3

我試圖用json.netJSON序列化格式

的對象序列化對象的集合看起來是這樣的:

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

很高興地考慮改變任何物體的形狀,或者甚至使用不同的序列化庫

回答

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 

在我看來類似於Dictionary中的單個條目,並且您可能通過以這種方式進行試驗而獲得一些里程數。

但是,JSON示例看起來完全合理。考慮到你有客戶使用這個,我可能不會擔心序列化,並且肯定會對妥協對象模型以反映所需的序列化(特別是鑑於它看起來合法且易於解析)而保持警惕。請注意,如果您更改序列號,則客戶必須能夠成功解析該序列。

如果您要修改JSON輸出,而不是妥協您的對象模型,我會隔離該更改 - 將您的TaxBand對象複製到TaxBandJson對象或類似對象中。