如果JSON属性包含没有JSON.stringify

时间:2017-08-10 19:49:21

标签: javascript jquery json kendo-ui kendo-grid

我有一个独特的问题。我目前正在尝试将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标头不能包含特殊字符。
  • 我无法使用jQuery修改$("#grid").html(),因为它会破坏网格绑定。
  • 钥匙可以是任何东西。价值也可以是任何东西。
  • JSON不是嵌套的或复杂的。
  • 我无法在KendoGrid列上定义字段/标题,因为我不知道字段/标题需要什么,数据非常动态。

我准备放弃这一点,只是从数据中删除所有#。如果有人能想出某种方法来实现这一点:重命名对象的属性,使所有#前面都有一个\,我们将非常感激。对于我的生活,我无法找到解决这个问题的方法。

0 个答案:

没有答案