2017-08-10 64 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

相關問題