从文件加载 JSON 与作为时间线事件的变量

Posted

技术标签:

【中文标题】从文件加载 JSON 与作为时间线事件的变量【英文标题】:Load JSON from file vs. as variable for timeline events 【发布时间】:2016-01-10 15:11:07 【问题描述】:

我使用 SMILES timeline 将事件数据作为 JSON 从文件和变量加载。

使用主页上的示例代码从文件加载可以正常工作:

tl = Timeline.create(document.getElementById("div-timeline"), bandInfos);
     Timeline.loadJSON("js/timelinedata.json", function(json, url) 
         eventSource.loadJSON(json, url); );

这是我的文件timelinedata.json的内容:

"dateTimeFormat": "iso8601",
"events" : [
        "start": "1924",
        "title": "Barfusserkirche",
        "description": "by Lyonel Feininger, American/German Painter, 1871-1956",
        "image": "link to an image",
        "link": "link to an article"
        
]

但是,当我将 JSON 粘贴到 var 中并尝试加载它时,我会收到抱怨。

这就是我填充我的变量的方式:

function TimeTestData1()
    var TimelineEvent =  "dateTimeFormat": "iso8601",
    "events" : [
            "start": "1924",
            "title": "Barfusserkirche",
            "description": "by Lyonel Feininger, American/German Painter, 1871-1956",
            "image": "link to an image",
           "link": "link to an article"
            
    ];
    return TimelineEvent;
  

并在时间轴中使用它:

var tdata = TimeTestData1();
console.dir(tdata); // this looks fine
// [ timeline code ]
Timeline.loadJSON(tdata, function(json, url)  eventSource.loadJSON(json, url); );

我收到一个带有消息的“警报”弹出窗口:

Failed to load json data from [object Object] Not Found

当我像这样使用JSON.stringify(tdata) 时:

Timeline.loadJSON(JSON.stringify(tdata), function(json, url) 
    eventSource.loadJSON(json, url); );

浏览器告诉我(使用警报弹出窗口):

无法从 "dateTimeFormat":"iso8601","events":["start":1924,"title":"Barfusserkirche","description":"by Lyonel Feininger 加载 json 数据,美国/德国画家,1871-1956","image":"图片链接","link":"文章链接"] 未找到

这里是时间轴函数的完整代码:

function LoadTimeline() 
    var tl;
    var eventSource = new Timeline.DefaultEventSource(0);
    //var tdata = TimeTestData1();
    var theme = Timeline.ClassicTheme.create();
    theme.timeline_start = new Date(Date.UTC(1890, 0, 1));
    theme.timeline_stop  = new Date(Date.UTC(2020, 0, 1));
    var d = Timeline.DateTime.parseGregorianDateTime("1950") // set date to display
    var bandInfos = [
        Timeline.createBandInfo(
            width:          "70%",
            intervalUnit:   Timeline.DateTime.YEAR,
            intervalPixels: 100,
        eventSource:    eventSource,
                date:           d
        ),
        Timeline.createBandInfo(
            width:          "30%", 
            intervalUnit:   Timeline.DateTime.CENTURY,
        eventSource:    eventSource,
            date:           d,
            intervalPixels: 200
        )
    ];
    bandInfos[1].syncWith = 0;
    bandInfos[1].highlight = true;
    tl = Timeline.create(document.getElementById("div-timeline"), bandInfos);
    Timeline.loadJSON("js/timelinedata.json", function(json, url) 
        eventSource.loadJSON(json, url); );
     //JSON.stringify(tdata) or tdata or  "js/timelinedata.json"

我如何传递我的事件 json var 以便时间线吃掉它?

【问题讨论】:

【参考方案1】:

Timeline.loadJSON 需要一个 URL,而不是 JSON。尝试完全删除该呼叫,而只呼叫eventSource.loadJSON(tdata, url);。 (不确定在这种情况下 url 参数的用途,文档对于这个项目看起来真的很糟糕)

【讨论】:

使用eventSource.loadJSON(JSON.stringify(tdata), document.location.href); 我没有收到任何错误,这是the mailinglist 中的解决方案,但我仍然可以看到我的活动。也许这条线是对的,而错误在其他地方? 可能您的数据格式不正确?尝试使用官方示例数据。【参考方案2】:

不确定是否有人会看到这一点,但 loadJSON() 期望 JSON 对象作为第一个参数,而不是字符串(这就是你通过说 JSON.stringify() 所做的)。所以只要 tdata 是兼容 Timeline 的 JSON 对象,那么你只需要

eventSource.loadJSON(tdata, window.location.href)

【讨论】:

以上是关于从文件加载 JSON 与作为时间线事件的变量的主要内容,如果未能解决你的问题,请参考以下文章

从 json 文件中获取标签名称作为类中的变量

转换 d3 图表以从变量内的 json 加载数据

SwiftUI 从 URL 加载单个对象 JSON

使用空字典作为值将 JSON 文件加载到 BigQuery

从外部 .json 文件加载默认数据并存储到 MongoDB

Select2 从本地 json 文件加载数据