2015-04-26 111 views
0

在解析內聯JSON對象d3.json(obj, function(error, root)時,它在本地運行時正常工作,但是當我在Tomcat服務器上運行時,出現XMLHttpparse錯誤。我通過互聯網搜索。我發現答案是CORS。但是如何實現這一點並不明確。你可以幫我嗎?D3.js JSON解析錯誤

var obj = { 
"name": "vis", 
"children": [ 
    { 
    "name": "Votes", 
    "children": [ 
    {"name": "200", "size": 200,"url":"1"}, 
    {"name": "500", "size": 500,"url":"2"}, 
    {"name": "300", "size": 300,"url":"3"}, 
    {"name": "400", "size": 400,"url":"4"} 
    ] 
    }, 
    { 
    "name": "Reputation", 
    "children": [ 
    {"name": "200", "size": 200}, 
    {"name": "500", "size": 500}, 
    {"name": "300", "size": 300}, 
    {"name": "400", "size": 400} 
    ] 
    }, 
    { 
    "name": "Accepted Answer", 
    "children": [  
    { 
    "name": "encoder", 
    "children": [ 
     {"name": "Accepted Answer", "size": 500} 
    ] 
    } 
    ] 
    } 
] 
}; 
d3.json(obj, function(error, root) { 
    alert('error '+error); 
    alert('root: '+root); 
    if (error) return console.log(error); 
} 

回答

0

您誤會了d3.json的用途。 d3.json發出一個實際的AJAX請求(因此爲什麼在文檔中將這個章節命名爲Requests),所以它實際上試圖獲取該obj,但不能,因爲它不需要。如果您真的想使用d3.json,您可以將該JSON對象移動到它自己的文件中,然後通過執行d3.json(data.json, function(err, root))來引用它。

結果d3.json將返回字面上是您聲明的對象。您可以簡單地將其分配給變量名稱root

相關問題:d3 js - loading json without a http get

+0

如果'obj'已經是一個JavaScript對象,爲什麼你需要'JSON.parse(obj)'? – Oleg

+0

@ Oleg好的,你可能不需要那樣做。我刪除了那個珍聞。 – aug

2

首先,確保你的網址是路過的第一個參數d3.json()。

其次,您需要配置Tomcat以支持CORS。在7.0.41+版本中,Tomcat包含一個CORS過濾器。將過濾器添加到您的web.xml文件。

這裏有您需要的最低配置:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

參見更多信息和附加配置選項的文檔:http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter

而這裏的請求處理此過濾器,可以幫助您設置一個flowchart增加任何附加參數:

CORS flowchart