2014-07-04 79 views
1

有沒有辦法解析非格式化的JSON,除了使用eval如何解析非格式化的JSON(可能使用jQuery)

的背景是,我使用數據標籤的值來繪製這樣的曲線圖:

<div id="data" data-idata="[1,2,3]" data-sdata="['foo','bar','baz']"></div> 

這與數值完美的作品,這些值直接在jQuery的數據傳送作爲陣列,無需要在這裏解析JSON。

但是,對於標籤,要傳遞一個字符串數組。 eval可以解析字符串sdata就好了,但JSON.parsejQuery.parseJSON失敗,因爲它的格式不正確。

var $data = $("#data").data(), 
    values; 

// use eval 
out("#out", eval($data.sdata)); // works... 

// use JSON.parse 
try 
{ 
    values = JSON.parse($data.sdata); 
} catch(e) { 
    // silent catch 
} 
out("#out1", values); // values is undefined 

我把一個JsFiddle here放在一起檢查的東西。

回答

3

你得到錯誤,因爲['foo','bar','baz']包含單引號。 JSON RFC指定string應包含在雙引號標記中。

可能有幾個解決方法。

開關引號在data-屬性:

<tag data-sdata='["foo","bar","baz"]' /> 

或更換的Javascript:

values = JSON.parse($data.sdata.replace("'","\"")); 
+0

準時標點符號,javascript中的缺陷之一。 – Nzall

0

Ofcourse您不能輕易地解析損壞的數據爲100%這適用於任何數據格式,而不僅僅是JSON。

如果數據格式不正確的原因總是相同的,你應該用一些str_find和替換函數來修復它。

如果它是不規則的,除了寫一個真正智能和大的算法外,沒有真正的機會。這裏最好的辦法是嘗試從損壞的字符串中提取真實的原始數據,並用有效的語法構建真正的JSON字符串。

1

你不需要解析。只需使用.data(),該功能就可以爲您提供幫助。

我已更改您的HTML,因爲JSON應在雙引號(")標記中使用,因此我已換行data-sdata="['foo', 'bar', 'baz']"中的引號。

HTML

<div id="data" data-idata="[1,2,3]" data-sdata='["foo", "bar", "baz"]'></div> 

腳本

out("#out1", $("#data").data('idata')); 
out("#out2", $("#data").data('sdata')); 

DEMO

0

嘗試

HTML

<div id="data" data-idata="[1,2,3]" data-sdata='["foo","bar","baz"]'></div> 
<div id="out1">out1</div> 
<div id="out2">out2</div> 

JS

$(function() { 
    var out = function (outputId, elem, dataId) { 
     return $.each(JSON.parse($(elem).get(0).dataset["" + dataId]) 
      , function (index, value) { 
      $("<ul>").html("<li>" + index + " -> " + value + "</li>") 
       .appendTo(outputId); 
     }); 
    }; 
    out("#out1", "#data", "idata"); 
    out("#out2", "#data", "sdata"); 
}); 

的jsfiddle http://jsfiddle.net/guest271314/4mJBp/