当前位置: 首页 > 面试题库 >

从JSON字符串而不是JSON文件渲染D3图

宣熙云
2023-03-14
问题内容

我正在尝试从我的Rails应用程序渲染以下树状图:http :
//bl.ocks.org/mbostock/4063570

我有一个带有许多属性的模型,但我想手动嵌套这些属性,并简单地使用字符串插值来构建自己的JSON字符串,然后将其直接传递给d3。

这是我的代码:

    <%= javascript_tag do %>
        var width = 960,
        height = 2200;

        var cluster = d3.layout.cluster()
        .size([height, width - 160]);

        var diagonal = d3.svg.diagonal()
        .projection(function(d) { return [d.y, d.x]; });

        var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height)
        .append("g")
        .attr("transform", "translate(40,0)");

        **d3.json("/assets/flare.json", function(root) {**
        var nodes = cluster.nodes(root),
        links = cluster.links(nodes);

        var link = svg.selectAll(".link")
        .data(links)
        .enter().append("path")
        .attr("class", "link")
        .attr("d", diagonal);

        var node = svg.selectAll(".node")
        .data(nodes)
        .enter().append("g")
        .attr("class", "node")
        .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; })

        node.append("circle")
        .attr("r", 4.5);

        node.append("text")
        .attr("dx", function(d) { return d.children ? -8 : 8; })
        .attr("dy", 3)
        .style("text-anchor", function(d) { return d.children ? "end" : "start"; })
        .text(function(d) { return d.name; });
        });

        d3.select(self.frameElement).style("height", height + "px");
    <% end %>

这是我的(未缩小的)JSON字符串:

var mystring = '{
    "name": "Product",
    "properties": {
        "id": {
            "type": "number",
            "description": "Product identifier",
            "required": true
        },
        "name": {
            "type": "string",
            "description": "Name of the product",
            "required": true
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "required": true
        },
        "tags": {
            "type": "array",
            "items": {
                "type": "string"
            }
        },
        "stock": {
            "type": "object",
            "properties": {
                "warehouse": {
                    "type": "number"
                },
                "retail": {
                    "type": "number"
                }
            }
        }
    }
}';

我尝试过的事情:

  1. 缩小JSON,以便仅输入一行(无效)

  2. 在字符串上运行JSON.parse(mystring)

  3. 查看D3文档,并谷歌搜索一种方法来修改以下函数以接受字符串而不是文件路径:

    d3.json("/assets/flare.json", function(root) {
        var nodes = cluster.nodes(root),
        links = cluster.links(nodes);
    

问题答案:

首先,让我们看一下d3.json

d3.json("/assets/flare.json", function(root) {
    // code that uses the object 'root'
});

/assets/flare.json将从服务器加载文件,将内容解释为JSON,并将结果对象作为root参数传递给匿名函数。

如果您已经有了JSON对象,则无需使用该d3.json函数-您可以直接使用该对象。

var root = {
   "name": "flare",
   "children": [
     ...
   ]
};
// code that uses the object 'root'

如果对象表示为字符串,则可以使用JSON.parse获取对象:

var myString = '{"name": "flare","children": [ ... ] }';
var root = JSON.parse(mystring);
// code that uses the object 'root'

其次,让我们看看d3.layout.cluster您对数据的期望。根据文档:

…默认的子级访问器假定每个输入数据都是具有子级数组的对象…

换句话说,您的数据必须采用以下形式:

var mystring = '{
    "name": "Product",
    "children": [
        {
            "name": "id",
            "type": "number",
            "description": "Product identifier",
            "required": true
        },
        ...
        {
            "name": "stock",
            "type": "object",
            "children": [
                {
                    "name: "warehouse",
                    "type": "number"
                },
                {
                    "name": "retail",
                    "type": "number"
                }
            ]
        }
    ]
}


 类似资料:
  • 以下endpoint以字符串形式返回用户名。 我如何构造它以返回一个json对象,该对象包含一个键,该键的值为该字符串(例如,{“user”:“joeuser”})?

  • 问题内容: 我正在尝试使用Python 3的内置JSON模块进行一些简单的JSON解析,并且从阅读有关SO和谷歌搜索的其他问题来看,这似乎应该非常简单。但是,我想我得到的是返回的字符串,而不是预期的字典。 首先,这是我尝试从中获取值的JSON。这只是Twitter API的一些输出 我将此字符串分配给名为json_string的变量,如下所示: 然后,当我尝试从“杰森”字典中获取特定密钥时: 我收

  • 问题内容: 我正在使用 Python 2 从 ASCII编码的 文本文件中解析JSON 。 当使用或 加载这些文件时,我所有的字符串值都转换为Unicode对象而不是字符串对象。问题是,我必须将数据与仅接受字符串对象的某些库一起使用。我 无法更改库, 也 无法 更新它们。 是否可以获取字符串对象而不是Unicode对象? 更新资料 很久以前 ,当我坚持使用 Python 2 时就问 了 这个问题。

  • 我在MySQL5.7中有TEST(id,INT,attributejson)表 当我尝试使用mysql包在Nodejs中查询表时,如下所示 null 有没有一种方法可以将上述结果中的包项作为JSON对象而不是字符串来获取,而不需要迭代数组并执行JSON.parse来将字符串转换为JSON? 预期产出

  • 问题内容: 由于空字符串是Go的零/默认值,因此我决定将所有此类字段定义为。例如 如果该值不适用于该特定字段,则我正在发送数据的应用程序期望使用null而不是空字符串。 这是正确的方法吗?或者有人可以向我指出比这更好的方法。 问题答案: 在json包文档中: 指针值编码为指向的值。nil指针编码为空JSON对象。 因此,您可以存储指向字符串的指针,如果不为nil,则将其编码为字符串;如果为nil,

  • 问题内容: 我敢肯定这已经被问过了,但是我找不到答案。 我有一个从数据库中提取然后呈现到内容的AngularJS脚本。一切工作正常,除了我试图将一些单词用它们之间的新行连接起来的几个地方。 如果我使用上述代码的第一行,则看不到任何内容,但重新标记的html中没有新行。如果使用第二行,则将其渲染为文本,并且输出如下所示: 代替 如果有帮助,我可以发布完整的脚本,但是我想我只是看不到一些简单的东西。