我使用动态ExpandoObject()来创建NVD3 / d3.js可视化所需的一些json。
nvd3库在数据标识符方面非常明确。
正是我需要的json是以下 -
[{
key: "AgeGroups",
values: [{
"label": "<20",
"value": 0
}, {
"label": ">20 <29",
"value": 160
}, {
"label": ">29 <39",
"value": 240
}]
}]
注意:字符串'key'必须是小写的,值必须是复数。
通过以下c#,我能够非常接近 -
ageDemoJson.AgeGroups = new object[]
{
new { label = "<20", value = lessThan20 },
new { label = ">20 <29", value = between20and29 },
new { label = ">29 <39", value = between29and39 },
};
这输出以下内容
[{
Key: "AgeGroups",
Value: [{
"label": "<20",
"value": 0
}, {
"label": ">20 <29",
"value": 160
}, {
"label": ">29 <39",
"value": 240
}]
}]
使用此输出,我需要自定义ExpandoObject的默认行为,并使字符串'Key'变为'key',字符串'value'变为'values'
无论如何这样做?
当然我可以解决这个问题,将json解析为字符串并替换javascript中我需要的东西,但是如果我不必这样做的话。
如果您使用的是asp.net核心,则可以通过添加以下行来更改JSON序列化:
services.AddMvc()
.AddJsonOptions(opts =>
{
// Force Camel Case to JSON
opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
或者你可以通过使用Newtonsoft的Json.NET使用此选项获得相同的结果:
string json = JsonConvert.SerializeObject(
yourObjectToSerialize,
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }
);