简体   繁体   English

如何字符串化循环 JSON 对象并将其保存到文件?

[英]How to stringify circular JSON object and save it to file?

I'm working on a radial tree diagram in javascript using d3.js and jquery.我正在使用 d3.js 和 jquery 在 javascript 中处理径向树图。 I use json files to load data into a javascript var.我使用 json 文件将数据加载到 javascript var 中。 After working on a diagram and making some changes, eg changing parent of some nodes, I want to stringify data and save as a json file.在处理图表并进行一些更改后,例如更改某些节点的父节点,我想对数据进行字符串化并另存为 json 文件。 When I stringify treeData variable, which includes all json data, and wanted to display it, I receive only the root node stringified.当我将包含所有 json 数据的 treeData 变量字符串化并想要显示它时,我只收到字符串化的根节点。 This is my code:这是我的代码:

var json = JSON.stringify(treeData.children, function(key,value){
    if(key == "children"){
        return undefined;
    }
    return value;
});
alert("Json: " + json);

Also I don't know why the key is set to "children".我也不知道为什么将键设置为“儿童”。 My JSON file structure:我的 JSON 文件结构:

{
 "name": "root",
 "children": [
  {
   "name": "child1",
   "children": [ ... ]
  }
 ]
}

您的对象文字中有一个children键,因此它被传递给回调,然后由于某种原因您返回 undefined,这将从结果中删除该键。

Circular JSON Objects can be stringified and saved with the following approach:可以使用以下方法对圆形 JSON 对象进行字符串化和保存:

import stringify from 'json-stringify-safe';
import fs from 'fs';

const content = stringify(myCircularJSONObject);

fs.writeFile('./data.json', content, ()=>{console.log('CREATED')});

If I understand correctly you are trying to achieve stringifying of an object structured as:如果我理解正确,您正在尝试实现对结构化对象的字符串化:

var obj = {};
obj.circle = obj;
var str = JSON.stringify(obj);
// → Error

This object will return an error with JSON.stringify although is otherwise valid.尽管在其他方面有效,但此对象将返回 JSON.stringify 错误。 If you don't mind the readability of the stringified object, I suggest using CircularJSON :如果您不介意字符串化对象的可读性,我建议使用CircularJSON

Install when using Node.js:使用 Node.js 时安装:

npm install --save circular-json

Install for web:为网络安装:

<script src="build/circular-json.js"></script>

And usage:和用法:

var object = {};
object.arr = [
    object, object
];
object.arr.push(object.arr);
object.obj = object;

var serialized = CircularJSON.stringify(object);
// → '{"arr":["~","~","~arr"],"obj":"~"}'

var unserialized = CircularJSON.parse(serialized);
// → { arr: [ [Circular], [Circular] ], obj: [Circular] }

The problem is that using tree data will return with a loop and circular data error.问题是使用树数据将返回循环和循环数据错误。 Switching key from "children" to "parent" give a json without references to the parents and work properly.将键从“子级”切换到“父级”给出一个 json 而不引用父级并且正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM