【问题标题】:Load two json files with same parent key name加载两个具有相同父键名称的 json 文件
【发布时间】:2015-06-14 19:49:55
【问题描述】:

我有两个具有相同父键的 json 文件。

示例: 文件A:

{ "results": [
    {
        "createdAt": "2014-02-25T23:49:39.076Z",
        "eventAddress": "1342 Worchester Drive Northeast",
        "eventAddress2": "",
        "eventCheckInCount": 600,
        "eventCity": "Atlanta",
        "eventCost": "100.00"
    }
}

文件B:

{
    "results": [
        {
            "title": "NIGHT RIOTS",
            "url": "http://www.centerstage-atlanta.com/show?id=1688&artist=NIGHT+RIOTS",
            "date": "3/27/2015 0:00:00",
            "time": "7:00:00 PM"
        },
        {
            "title": "HORSE FEATHERS",
            "url": "http://www.centerstage-atlanta.com/show?id=1641&artist=HORSE+FEATHERS",
            "date": "3/23/2015 0:00:00",
            "time": ""
        }
}

基本上我已经编写了一个 javascript 代码来合并两个 json 输出中的键,但是当我像这样给每个输出一个变量名时,我设法做到了。

在文件 A 中: var filea = {“结果”:{[]}}

在文件 B 中: var fileb = {“结果”:{[]}}

但是,鉴于文件的数量和大小,将“var filea =”添加到每个 json 文件是很繁琐的。在 html 中,如果我为上述两个文件都包含一个脚本标签,我如何将每个文件中的数据读取到两个不同的变量中。

根据您的经验,还有其他方法可以将 json 文件合并为一个。

问候,

沙希德

【问题讨论】:

  • 你为什么需要var?如果您使用 ajax 加载文件,则不需要它并且实际上会失败,因为它不再是有效的 json。另一种选择是在服务器读取文件并解码为数组并在那里合并
  • 其实我根本没有使用jQuery,它是stackoverflow建议的标签。我试图避免基于服务器的任何东西。现在,我正在使用一个简单的 .html 文件离线完成所有操作
  • 我明白你的建议,但你希望我将这两个文件动态加载到一个单独的变量中,而不是使用
  • 不,它不是...尽管您可以通过浏览器设置强制它。如果有帮助,也可以在您的机器上安装本地服务器

标签: javascript jquery html json merge


【解决方案1】:

正如 charlietfl 上面评论的那样,我最终使用 XMLHttpRequest 并将每个 json 文件加载到单独的变量中。在使用 file:// 协议时,Chrome 上的 XMLHttpRequest 失败,但我让我的用户切换到 FF,因为 Chrome 对任务的其他部分也有限制。

沙希德

<input type="text" id="filea" value="" />
<input type="text" id="fileb" value="" />
<input type="button" value="Merge" onclick="mergeJSON();return false" />

<script>
    function getJSON(filename) {
        var req = new XMLHttpRequest();
        req.open('GET', filename, false); 
        req.send(null);
        if(req.status != 200)
            alert('Error reading file: ' + filename);
        return req.responseText;
    }

        fileaname = document.getElementById('filea').value;
        filebname = document.getElementById('fileb').value;

            //our return object
            var ret = getJSON(fileaname);
            var fileb = getJSON(filebname);

</script>

【讨论】:

    【解决方案2】:

    我会连接两个文件,为简单起见删除空格,然后使用正则表达式查看“结果”的后面并捕获它。

    这就是你在 bash 中的做法,我想你可以用 javascript 来做类似的事情,以备不时之需。

    cat FileA.json FileB.json > concatenated.json
    sed -r 's/\s+//g'
    cat concatenated.json | grep -oE '"results":{[.*]}'
    

    然后使用该输出来满足您的需求。

    PS:你可以在here中测试你的正则表达式。

    编辑:

    如果您使用 JQuery,有什么理由不能只使用 extend

    【讨论】:

    • 连接的一个问题是两个文件中的一些子键可以有不同的值。在这种情况下,filea 中的值需要优先于另一个。
    • 但想法不是存储连接的文本,它只是使用正则表达式从中提取您需要的部分,然后使用正则表达式的输出。另外,请注意,串联并不是完全必要的,您可以为每个文件执行正则表达式,然后对每个输出执行您的逻辑。我刚刚提到这种方式是因为它对于最简单的情况来说是最简单的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2022-06-14
    • 2018-10-05
    相关资源
    最近更新 更多