重命名 JSON 属性(如果它们包含没有 JSON.stringify 的特定字符)



我有一个独特的问题。我目前正在尝试将 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___,你可以用以后的任何字符替换它。

最新更新