2015-09-19 3 views
1

Я использую Python для очистки некоторых данных из Интернета перед визуализацией указанных данных с помощью d3.js. У меня проблема с чтением сгенерированного JSON в d3.js.d3.js не читает Python-generated JSON

Python код:

course_json_list = [] 
obj = {u"course_id": course_id, u"prereqs": prereqs} 
     course_json_list.append(json.dumps(obj, indent=4)) 


# setting up JSON output file 
json_output = {"nodes": course_json_list, 
       "links": None} 

with open("course-data.json", "w") as outfile: 
    json.dump(json_output, fp=outfile) 

Когда я открываю этот код в GVim, я вижу: {"nodes": ["{\n \"course_id\": \"Course 1\",\n \"prereqs\": null,\n...

Мой d3.js код:

var dataset; 
d3.json('course-data.json', function(error, json_data) { 
    if (error) console.log(error); 
    dataset = json_data; 
    d3.select("body").selectAll("p") 
      .data(dataset.nodes) 
      .enter() 
      .append("p") 
      .text(function(d) { 
      //When this is return d; it works 
       return d["course_id"]; 
    }); 
}); 

Я положил его в JSONLint и возвращается:

{ 
    "nodes": [ 
     "{\n \"course_id\": \"Course 1\", \n \"prereqs\": null, \n \"off_w\": null, \n \"name\": \"Intro\"\n}", 
     "{\n \"course_id\": \"Course 2\", \n ... 

JSONLint говорит, что JSON действителен, но мой код d3.js его не будет читать. Это мой питон, создающий плохой JSON? Если да, то как мне сгенерировать его правильно? Я неправильно ссылаюсь на JSON в d3.js?

Благодаря

ответ

1

Даже если JSONLint говорит, что код «действителен», я не думаю, что это кодировка вы стремитесь, то есть плоский список под ключ nodes.

Вы - dump - слишком часто JSON и вызываете двойную сериализацию.

Вместо course_json_list.append(json.dumps(obj, indent=4)), возможно, вам понадобится только course_json_list.append(obj). В вашем случае вы сохраняете строки в course_json_list, который сбрасывается как строка. В последней версии вы храните объекты рекурсивно, а затем полагаетесь на окончательный json.dump, чтобы заботиться о сериализации объекта рекурсивно.