[英]How to send JSON with javascript function from WebAPI controller without quotes
我们有
我们的一个 API 生成一个 C# object,它代表一个 ChartJS model。 像这样
public virtual IActionResult Chart()
{
var chartModel = GetChart();
return new ObjectResult(chartModel);
}
ChartModel class 简化看起来像这样
public class ChartJSModel
{
...
public string callback { get; set; } //FUNCTION
...
}
客户端收到此 JSON ObjectResult(再次简化)
{
"callback": "function(value, index, values) { return Number(value.toString());}"
}
回调 function 用引号引起来。 这打破了 ChartJS。
问题
you can't have functions in JSON - in JSON, values can only be... object, array, string, number, null, true or false
这并不是说您想要做的事情是无法实现的-您只需要跳出框框思考...例如在服务器上发送{“回调”:“fn1”}...在客户端中,处理已解析的 JSON (即,您现在拥有的 javascript Object)并查找回调键,并相应地更改值......“fn1”到函数(......等
所以,如果你改变你的服务器代码来发送类似的东西
{
"type": "line",
"data": {
"datasets": [
]
},
"options": {
"scales": {
"xAxes": [{
"type": "logarithmic",
"position": "bottom",
"ticks": {
"beginAtZero": false,
"min": 0.0,
"max": "NaN",
"stepSize": "NaN",
"callback": "fn1"
},
}
],
"yAxes": [{
"type": "logarithmic",
"position": "left",
"ticks": {
"beginAtZero": false,
"min": 0.0,
"max": "NaN",
"stepSize": "NaN",
"callback": "fn1arrow"
},
}
]
},
}
}
然后你可以写一个 function 像
function fixCallbacks(obj) {
const fns = {
fn1: function(value, index, values) { return Number(value.toString());},
fn1arrow: (value, index, values) => Number(value.toString()),
};
Object.entries(obj).forEach(([k, v]) => {
if (typeof v === 'object' || typeof v === 'array') {
fixCallbacks(v);
} else if (k === 'callback') {
obj[k] = fns[v] || obj[k];
}
});
}
注意:fn1 和 fn1arrow 做同样的事情,只是显示你可以使用函数和箭头函数作为解决方案
它应该工作 - 像这样
const data = { "type": "line", "data": { "datasets": [ ] }, "options": { "scales": { "xAxes": [{ "type": "logarithmic", "position": "bottom", "ticks": { "beginAtZero": false, "min": 0.0, "max": "NaN", "stepSize": "NaN", "callback": "fn1" }, } ], "yAxes": [{ "type": "logarithmic", "position": "left", "ticks": { "beginAtZero": false, "min": 0.0, "max": "NaN", "stepSize": "NaN", "callback": "fn1arrow" }, } ] }, } }; function fixCallbacks(obj) { const fns = { fn1: function(value, index, values) { return Number(value.toString());}, fn1arrow: (value, index, values) => Number(value.toString()), }; Object.entries(obj).forEach(([k, v]) => { if (typeof v === 'object' || typeof v === 'array') { fixCallbacks(v); } else if (k === 'callback') { obj[k] = fns[v] || obj[k]; } }); } // here we "fix" the data fixCallbacks(data); // console.log(data);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.