2017-08-10 59 views
1

我有一点独特的问题。我目前正试图将JSON数据源连接到剑道网格。正因为如此,JSON中的任何地方都不会有#,因为它会与kendo混淆。所以,我不得不采取的数据是这样的:重命名JSON属性,如果它们包含某个字符而没有JSON.stringify

[ 
    {"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。然后,在创建kendo网格之后,我试着用jQuery替换所有hashliteral#

var fixed = $("#grid").html().replace(/hashliteral/g, "#"); 
$("#grid").html(fixed); 

这是行不通的,但它打破了剑道网格和所有的绑定。网格功能是必须的,所以我不能使用这个解决方案。

只是为了重温

我试图删除/替换或逃避JSON数据的所有#,使之与我的剑道电网正确运行。

  • 我不能使用JSON.stringify\\#更换#因为那时JSON.parse失败。
  • 我不能使用#,因为Kendo头文件不能有特殊字符。
  • 我不能使用jQuery修改$("#grid").html(),因为它打破了网格绑定。
  • 关键可以是任何东西。价值也可以是任何东西。
  • JSON不嵌套或复杂。
  • 我无法在KendoGrid列上定义字段/标题,因为我不知道字段/标题需要什么,数据非常动态。

我即将准备放弃这一点,只是从数据中删除所有#。如果任何人都可以想出一些办法来实现这一点:重命名对象的属性,以便所有#前面有\,这将不胜感激。对于我的生活,我无法找到解决这个问题的办法。

+0

似乎没有任何问题,在#中有一个值。检查[this out](http://dojo.telerik.com/IJaKuH)。尽管我设法通过'#'逃避了标题的标题,但是它把模板搞砸了。 IMO是一个错误,它应该照顾它... – DontVoteMeDown

+0

为什么你不循环所有的属性,并建立一个新的对象进一步处理?我错过了什么? – lexith

+0

@lexith我还没有找到一种方法来做到这一点,但不知道什么oldkeys/newkeys – Sunden

回答

1

我想你已经在正确的轨道上,但它更容易只是创建对象的一个​​新的列表:

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___一些东西,你可以用任何后来替换即可。

+0

谢谢!这正是我正在寻找的东西,你是对的,我在那里一半。在网格创建后,我只是做了一个jQuery查找,并用'#'替换了'__HASHLITERAL__'。现在效果很好。 – Sunden

+0

高兴地帮助:) – lexith

相关问题