Javascript 解析存储在数据库中的json字符串以呈现D3树布局

Javascript 解析存储在数据库中的json字符串以呈现D3树布局,javascript,d3.js,Javascript,D3.js,我试图使用从mysql数据库中存储的字符串中获取的json填充D3可扩展树布局 我从mysql获取json,如下所示: jQuery.ajax({ type: "POST", url: '../connect/database.php', dataType: 'json', data: {functionname: 'read_from_database', arguments: [user_id]}

我试图使用从mysql数据库中存储的字符串中获取的json填充D3可扩展树布局

我从mysql获取json,如下所示:

jQuery.ajax({
            type: "POST",
            url: '../connect/database.php',
            dataType: 'json',
            data: {functionname: 'read_from_database', arguments: [user_id]},
            success: function (obj, textstatus) {
            if( !('error' in obj) ) {
               localStorage.setItem('json_string', JSON.stringify(obj.query_result.stored_json_string));
              }
            else {
               console.log(obj.error);
              }
             }
            });
这将json字符串设置为本地存储。工作完美

然后,我从本地存储中取出这个字符串,如下所示:

var json_string = localStorage.getItem('json_string');
这给了我D3布局所需的字符串。它的格式与D3站点上使用的flare.json文件相同

D3从数据中呈现树的主要部分是这一部分。我只是从本地存储添加了json_字符串,并在d3.json调用中使用了json.parse。这也是在获取数据2秒后触发的,因此我已经确认确实加载了json_字符串

d3.json(json_string, function(json) {
root = JSON.parse(json);
root.x0 = h / 2;
root.y0 = 0;

function toggleAll(d) {
if (d.children) {
  d.children.forEach(toggleAll);
  toggle(d);
}
} 

// Initialize the display to show a few nodes.
root.children.forEach(toggleAll);
toggle(root.children[1]);
toggle(root.children[1].children[2]);
toggle(root.children[9]);
toggle(root.children[9].children[0]);
update(root);
});
但这会在浏览器中产生以下错误:

GET http://blahblahdotcom/path/tree/%22%7B/%22name/%22:/%22flare/%…%7D,%7B/%22name/%22:/%22Visualization/%22,/%22size/%22:16540%7D]%7D]%7D%22 414 (Request-URI Too Long)
d3.xhr @ d3.js:385
d3.text @ d3.js:395
d3.json @ d3.js:398
load_tree @ tree.html:65
(anonymous) @ tree.html:190
tree.html:67 Uncaught TypeError: Cannot set property 'x0' of null

d3.json
用于
.json
文件。因为您已经加载了JSON,所以不需要使用它

您可以用它替换
jQuery.ajax
调用,但是假设您想继续用jQuery加载数据,您可以删除
d3.json
调用

var root = JSON.parse(json_string);
// ...
编辑:

您还将字符串化从服务器加载的
obj.query\u result.stored\u json\u string
,但它已经是一个字符串,因此这是不必要的,需要您调用
json.parse
两次才能获得所需的对象

const serverValue='{“a”:“b”};
log('serverValue=',serverValue,typeof serverValue);
//当你字符串化一个字符串时,你会得到一个转义字符串
const stringified=JSON.stringify(serverValue);
log('stringified=',stringified,typeof stringified);
//第一次解析它时,会得到一个字符串
const firstParse=JSON.parse(字符串化);
log('firstParse=',firstParse,typeof firstParse);
//第二次解析时,会得到一个对象
const secondParse=JSON.parse(firstParse);

log('secondParse=',secondParse,typeof secondParse)谢谢你的评论。我尝试了这一点,并给出了以下错误:Uncaught TypeError:无法读取undefinedI的属性“forEach”。我已将flare.json存储为数据库中的字符串,如所示。所以json格式应该没有任何问题。哪个
forEach
调用抛出了错误?行root.children.forEach(toggall)上的
root.children.forEach
one;您是否检查了
根对象
对象?这似乎意味着该对象没有
子对象
数组。