首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当文件中有其他对象时,合并具有公共键值的两个JSON文件

当文件中有其他对象时,合并具有公共键值的两个JSON文件
EN

Stack Overflow用户
提问于 2020-12-10 20:35:42
回答 1查看 132关注 0票数 0

我有两个要合并的JSON文件,其中一个在这里:

文件1:

https://raw.githubusercontent.com/zcreativelabs/react-simple-maps/master/topojson-maps/world-110m.json

文件2:

https://gist.github.com/ArchieHicklin/764812b232a6cdc157d50da40bc033a5

文件1开始有一个拓扑对象和数组,以及许多可以忽略的东西:

代码语言:javascript
复制
{
"type": "Topology",
"arcs": [
    [
        [16814, 15074],
        [71, -45],
        [53, 16],
        [15, 54],
        [55, 18],
        [39, 37],
        [14, 95],
        [59, 24],
        [11, 42],
        [32, -32],
        [21, -3]
    ],

..。

然后进入一个国家数组(这是我想要增加价值的部分):

代码语言:javascript
复制
"objects": {
    "ne_110m_admin_0_countries": {
        "type": "GeometryCollection",
        "geometries": [{
            "arcs": [
                [0, 1, 2, 3, 4, 5]
            ],
            "type": "Polygon",
            "properties": {
                "NAME": "Afghanistan",
                "NAME_LONG": "Afghanistan",
                "ABBREV": "Afg.",
                "FORMAL_EN": "Islamic State of Afghanistan",
                "POP_EST": 34124811,
                "POP_RANK": 15,
                "GDP_MD_EST": 64080,
                "POP_YEAR": 2017,
                "GDP_YEAR": 2016,
                "ISO_A2": "AF",
                "ISO_A3": "AFG",
                "CONTINENT": "Asia",
                "REGION_UN": "Asia",
                "SUBREGION": "Southern Asia"
            }
        },

文件2具有相同国家/地区的数组,但具有附加值:

代码语言:javascript
复制
{ "NAME": "Afghanistan", "BRANDONE": "Xiaomi", "BRANDTWO": "Apple", "BRANDTHREE": "Huawei", "BRANDFOUR": "Unknown", "BRANDFIVE": "Samsung", "BRANDSIX": "Oppo" },

正如你所看到的,文件1和文件2之间的公共值键是"NAME“。

理想情况下,我希望合并这些文件,以便原始文件包含来自另一个文件的额外值,例如:

代码语言:javascript
复制
"objects": {
"ne_110m_admin_0_countries": {
    "type": "GeometryCollection",
    "geometries": [{
        "arcs": [
            [0, 1, 2, 3, 4, 5]
        ],
        "type": "Polygon",
        "properties": {
            "NAME": "Afghanistan",
            "NAME_LONG": "Afghanistan",
            "ABBREV": "Afg.",
            "FORMAL_EN": "Islamic State of Afghanistan",
            "POP_EST": 34124811,
            "POP_RANK": 15,
            "GDP_MD_EST": 64080,
            "POP_YEAR": 2017,
            "GDP_YEAR": 2016,
            "ISO_A2": "AF",
            "ISO_A3": "AFG",
            "CONTINENT": "Asia",
            "REGION_UN": "Asia",
            "SUBREGION": "Southern Asia",
            "BRANDONE": "Xiaomi", 
            "BRANDTWO": "Apple", 
            "BRANDTHREE": "Huawei", 
            "BRANDFOUR": "Unknown", 
            "BRANDFIVE": "Samsung", 
            "BRANDSIX": "Oppo"
        }
    },

我在这里尝试了很多合并答案,但当我合并时

(如jq -s '[ .[0] + .[1] | group_by(.NAME)[] | select(length > 1) | add ]' clean.json world.json)

但我总是以一个错误结束:

jq: error (at file2.json:13575): array ([{"NAME":"A...) and object ({"type":"To...) cannot be added

有没有人知道我想做的事情在jq中是不是可以实现的?为什么我总是得到一个错误?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-11 02:01:58

首先构造一个字典,然后使用它执行更新:

代码语言:javascript
复制
jq --argfile new 2.json '
 ($new | INDEX(.NAME)) as $dict
 | .objects.ne_110m_admin_0_countries.geometries[].properties
     |= (if $dict[.NAME] then . + $dict[.NAME] else . end)
' 1.json

顺便说一下..。

这里最困难的部分是确定相关的路径。jq出手相救:

代码语言:javascript
复制
jq -c 'paths(. == "Afghanistan")' 1.json

另一种可能性是盲目地更新与“properties”相关的每个值:

代码语言:javascript
复制
($new | INDEX(.NAME)) as $dict
| walk(if type == "object" and .properties
       then .properties |= . + $dict[.NAME]
       else . end)

这实际上会产生相同的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65234659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档