我有一个独特的问题。我目前正在尝试将 JSON 数据源连接到剑道网格。因此,JSON 中的任何地方都不能有#
,因为它会弄乱剑道。所以我必须获取这样的数据:
[
{"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;
}
});
这适用于价值观!但是,键仍然可能包含#
这会弄乱我的剑道网格。我试图遍历每个对象和键/对,如果它有#
,则替换键,但由于某种原因,当我调用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
。然后,在创建剑道网格后,我尝试使用 jQuery 将所有hashliteral
替换为#
。
var fixed = $("#grid").html().replace(/hashliteral/g, "#");
$("#grid").html(fixed);
这确实有效,但它会破坏剑道网格和所有绑定。网格功能是必须的,所以我不能使用此解决方案。
回顾一下
我正在尝试删除/替换或转义 JSON 数据中的所有#
,以便它在我的剑道网格中正常运行。
- 我不能使用
JSON.stringify
并将#
替换为\#
,因为那样JSON.parse
就会失败。 - 我不能使用
#
因为剑道标题不能有特殊字符。 - 我不能使用 jQuery 来修改
$("#grid").html()
,因为它会破坏网格绑定。 - 关键可以是任何东西。该值也可以是任何值。
- JSON 不是嵌套的或复杂的。
- 我无法在 KendoGrid 列上定义字段/标题,因为我不知道字段/标题需要是什么,数据是非常动态的。
我准备放弃这一点,只是从数据中删除所有#
。如果有人能想到某种方法来实现这一目标:重命名对象的属性,以便所有#
前面都有一个,将不胜感激。对于我的生活,我找不到解决这个问题的方法。
我认为您已经走在正确的轨道上,但是创建一个新的对象列表会更容易:
var newObjects = [];
for (var i = 0; i < dataSource.length; i++ ) {
var currentObject = dataSource[i];
var newObject = {};
for (var key in currentObject) {
if (currentObject.hasOwnProperty(key)) {
var newKeyName = key.replace("#", "__HASHLITERAL__");
var newValue = currentObject[key];
if(typeof newValue === "string") {
newValue = newValue.replace("#", "__HASHLITERAL__");
}
newObject[newKeyName] = newValue;
}
}
newObjects.push(newObject);
}
console.log(newObjects);
希望它有所帮助,我正确理解了您的问题。
编辑:你不能有像这样的特殊字符作为键,所以你必须实际使用一些独特的东西,比如
___something___
,你可以用以后的任何字符替换它。