我有一个独特的问题。我目前正在尝试将JSON数据源连接到kendo网格。因此,JSON中任何地方都不能有#
,因为它与kendo混淆。所以我必须采取这样的数据:
[
{"ID#": "1", "Prop1": "Val1#"},
{"ID#": "2", "Prop2": "Val2"},
]
并逃脱#
以便剑道能够理解它:
[
{"ID\#": "1", "Prop1": "Val1\#"},
{"ID\#": "2", "Prop2": "Val2"},
]
这个问题的最大问题是JSON可能几乎与任何东西相似:可能有任何数字/名称的键/值。
我的尝试:
我试图逃避#
,如此:var dataSource = JSON.parse(result.replace("#", "\\#"));
但是,当我尝试这样做时,JSON.parse会抛出错误:
SyntaxError: JSON.parse: bad escaped character at line 1 column 7 of the JSON data
然后我尝试将#
替换为#
。事实证明,Kendo只能在行中支持HTML实体,而不能在列标题中支持HTML实体,而不会出现模板错误。所以我可以像这样替换属性值:
var dataSource = JSON.parse(result, function(key, value) {
if(typeof value === "string") {
return value.replace("#", "#");
}
else {
return value;
}
});
这适用于价值观!但是,键仍然可能包含#
,这会弄乱我的Kendo Grid。我尝试遍历每个对象和键/对并替换密钥,如果它有#
,但由于某种原因,当我调用Object.keys
时,返回的数组只是0和1,即使这是不是我的数据命名。
for (var object in dataSource) {
for (var property in object) {
if (object.hasOwnProperty(property)) {
var keys = Object.keys(object);
for(var key in keys) {
var oldName = key;
var newName = key.replace("#", "\#");
object[newName] = object[oldName];
delete object[oldName];
}
}
}
}
以上部分似乎没有效果。它甚至不会抛出错误。
我还尝试用字符串#
替换hashliteral
。然后,在创建了kendo网格之后,我尝试使用jQuery将所有hashliteral
替换为#
。
var fixed = $("#grid").html().replace(/hashliteral/g, "#");
$("#grid").html(fixed);
这确实有效,但它打破了剑道网格和所有绑定。网格功能是必须的,所以我不能使用这个解决方案。
回顾
我正在尝试删除/替换或转义JSON数据中的所有#
,以便它能够与我的Kendo Grid一起正常运行。
JSON.stringify
并将#
替换为\\#
,因为JSON.parse
失败。#
,因为Kendo标头不能包含特殊字符。$("#grid").html()
,因为它会破坏网格绑定。我准备放弃这一点,只是从数据中删除所有#
。如果有人能想出某种方法来实现这一点:重命名对象的属性,使所有#
前面都有一个\
,我们将非常感激。对于我的生活,我无法找到解决这个问题的方法。