2012-08-02 79 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对象或类似对象中。