2017-06-22 69 views
0

我有兩個相同的json文件 - test.jsontest2.json,格式如下。我的目標是將它們結合起來並保持完全相同的格式 - 基本上將一個堆疊在另一個上面而不創建兩個列表。結合沒有額外括號的JSON文件

我是新來bash和JQ但是這個代碼引發一個錯誤:

jq -s '.[0] * .[1]' test.json test2.json 

jq: error (at test2.json:17): array ([{"vendor":...) and array ([{"vendor":...) cannot be multiplied 

爲什麼會出現這種情況,一個人如何保存格式,而無需編寫額外的括號[]。如何在整個文件中組合並保留一對括號?見下文:

test.json

[ 
    { 
    "vendor": 0, 
    "startTime": 4380, 
    "endTime": 4445 
    }, 
    { 
    "vendor": 0, 
    "startTime": 4448, 
    "endTime": 4453 
    }, 
    { 
    "vendor": 0, 
    "startTime": 4696, 
    "endTime": 4880 
    } 
] 

不期望的輸出:

[ 
    [ 
    {"vendor":0,"startTime":4380,"endTime":4445}, 
    {"vendor":0,"startTime":4448,"endTime":4453}, 
    {"vendor":0,"startTime":4696,"endTime":4880}], 

    [{"vendor":0,"startTime":4380,"endTime":4445}, 
     {"vendor":0,"startTime":4448,"endTime":4453}, 
     {"vendor":0,"startTime":4696,"endTime":4880} 
    ] 
] 

期望的輸出:

[ 
    {"vendor":0,"startTime":4380,"endTime":4445}, 
    {"vendor":0,"startTime":4448,"endTime":4453}, 
    {"vendor":0,"startTime":4696,"endTime":4880}, 
    {"vendor":0,"startTime":4380,"endTime":4445}, 
    {"vendor":0,"startTime":4448,"endTime":4453}, 
    {"vendor":0,"startTime":4696,"endTime":4880} 
    ] 
+0

你使用什麼命令來完成任務? bash可能是這樣的,像Python這樣的其他語言可以很容易地做到這一點,如果你喜歡,我可以很快就給你一個腳本,儘管 – armnotstrong

+0

抱歉忘了包含它 - 更新,謝謝 –

回答

2

以下調用產生所需的結果:

jq -s add input.json input.json 

簡而言之,-s(「slurp」)選項將所有頂級輸入JSON實體放入數組中,在當前情況下生成一個數組數組。 add然後「添加」這個數組的組件 - add是多態的,在這裏連接組件數組具有效果。

如果你的JQ有inputs,你可以寫類似:

jq -n '[inputs]|add' input.json input.json 

or: 

jq -n '[inputs[]]' input.json input.json 

順便說一句,還有其他的方式來傳遞JSON的文件到JQ。

-2

我已經弗使用jq命令

但是你可以用python腳本做到這一點很容易:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

# Author:  
# Maintainer: 
import simplejson as json 

def test(): 
    with open("test.json") as fp: 
     js1 = json.loads(fp.read()) 
     with open("test2.json") as fp1: 
      js2 = json.loads(fp1.read()) 
      js = js1 + js2 
      print(json.dumps(js, indent=4)) 



if __name__ == "__main__": 
    test() 

# vim:ai:et:sts=4:sw=4: 

注意,你可能需要做的唯一的事情就是與

sudo pip install simplejson

安裝simplejson軟件包,因爲它可能無法與運你的發行,祝你好運

+0

'simplejson'已成爲標準庫的一部分作爲自Python 2.6以來的'json'。 'json.load'需要一個類似文件的對象;不需要手動調用'read'。一旦你解析了'test.json'就不需要保持打開狀態,所以不要嵌套'with'語句。 – chepner