2017-07-27 69 views
1

我有一個json文件,我需要轉換爲csv文件,但我有點擔心信任json-to-csv轉換器網站,因爲輸出的數據似乎不正確...所以我希望能夠得到一些幫助在這裏!如何使用json數據格式化csv文件?

我有以下的JSON文件結構:

{ 
    "GroupName": "GrpName13", 
    "Number": 3, 
    "Notes": "Test Group ", 
    "Units": [ 
    { 
     "UnitNumber": "TestUnit13", 
     "DataSource": "Factory", 
     "ContractNumber": "TestContract13", 
     "CarNumber": "2", 
     "ControllerTypeMessageId" : 4, 
     "NumberOfLandings": 4, 
     "CreatedBy": "user1", 
     "CommissionModeMessageId": 2, 
     "Details": [ 
     { 
      "DetailName": "TestFloor13", 
      "DetailNumber": "5" 
     } 
     ], 
     "UnitDevices": [ 
     { 
      "DeviceTypeMessageId": 1, 
      "CreatedBy": "user1" 
     }        
     ] 
    } 
    ] 
} 

我覺得我看到的是,該轉換器似乎無法領悟許多嵌套數據值的問題。我認爲轉換器錯誤的原因是因爲當我嘗試使用它們轉換回json時,我沒有收到相同的結構。

有誰知道如何手動將此json格式化爲csv格式,還是知道可以處理嵌套值的可靠轉換器?

+1

好CSV格式意味着你正在處理一個*定期*表。在CSV文件中無法正確表示樹狀結構。但是,如果您正在「轉換」的結構始終具有相同的結構和相同數量的子項,則可以將樹結構轉換爲以相同方式用於所有元素的列。 I. e。:在生成CVS文件之前,您必須首先「扁平」您的結構。 – cars10m

回答

0

我已經試過你的JSON在本作網址:

http://www.convertcsv.com/json-to-csv.htm

結果: UnitNumber,數據源,ContractNumber,CarNumber,ControllerTypeMessageId,NumberOfLandings,CreatedBy,CommissionModeMessageId,細節/ 0/DetailName, TestUnit13,Test1,TestContract13,2,4,4,user1,2,TestFloor13,5,1,user1

因爲它可以保存密鑰的路徑,如li中的'DeviceTypeMessageId' st'UnitDevices':它會用'UnitDevices/0/DeviceTypeMessageId'命名列名,這可以避免同名錯誤,所以你可以通過它的轉換器規則得到列名。

希望有幫助。

0

下面是使用jq

溶液如果文件filter.jq包含

def denormalize: 
    def headers($p): 
     keys_unsorted[] as $k 
    | if .[$k]|type == "array" then (.[$k]|first|headers("\($p)\($k)_")) 
     else "\($p)\($k)" 
     end 
    ; 
    def setup: 
    [ 
     keys_unsorted[] as $k 
    | if .[$k]|type == "array" then [ .[$k][]| setup ] 
     else .[$k] 
     end 
    ] 
    ; 
    def iter: 
    if length == 0 then [] 
    elif .[0]|type != "array" then 
     [.[0]] + (.[1:] | iter) 
    else 
     (.[0][] | iter) as $x 
     | (.[1:] | iter) as $y 
     | [$x[]] + $y 
    end 
    ; 
    [ headers("") ], (setup | iter) 
; 

denormalize | @csv 

data.json含有(補充說明額外的樣品)

{ 
    "GroupName": "GrpName13", 
    "Notes": "Test Group ", 
    "Number": 3, 
    "Units": [ 
    { 
     "CarNumber": "2", 
     "CommissionModeMessageId": 2, 
     "ContractNumber": "TestContract13", 
     "ControllerTypeMessageId": 4, 
     "CreatedBy": "user1", 
     "DataSource": "Factory", 
     "Details": [ 
     { 
      "DetailName": "TestFloor13", 
      "DetailNumber": "5" 
     } 
     ], 
     "NumberOfLandings": 4, 
     "UnitDevices": [ 
     { 
      "CreatedBy": "user1", 
      "DeviceTypeMessageId": 1 
     }, 
     { 
      "CreatedBy": "user10", 
      "DeviceTypeMessageId": 10 
     } 
     ], 
     "UnitNumber": "TestUnit13" 
    }, 
    { 
     "CarNumber": "99", 
     "CommissionModeMessageId": 99, 
     "ContractNumber": "Contract99", 
     "ControllerTypeMessageId": 99, 
     "CreatedBy": "user99", 
     "DataSource": "Another Factory", 
     "Details": [ 
     { 
      "DetailName": "TestFloor99", 
      "DetailNumber": "99" 
     } 
     ], 
     "NumberOfLandings": 99, 
     "UnitDevices": [ 
     { 
      "CreatedBy": "user99", 
      "DeviceTypeMessageId": 99 
     } 
     ], 
     "UnitNumber": "Unit99" 
    } 
    ] 
} 

則命令

jq -M -r -f filter.jq data.json  

會產生

"GroupName","Notes","Number","Units_CarNumber","Units_CommissionModeMessageId","Units_ContractNumber","Units_ControllerTypeMessageId","Units_CreatedBy","Units_DataSource","Units_Details_DetailName","Units_Details_DetailNumber","Units_NumberOfLandings","Units_UnitDevices_CreatedBy","Units_UnitDevices_DeviceTypeMessageId","Units_UnitNumber" 
"GrpName13","Test Group ",3,"2",2,"TestContract13",4,"user1","Factory","TestFloor13","5",4,"user1",1,"TestUnit13" 
"GrpName13","Test Group ",3,"2",2,"TestContract13",4,"user1","Factory","TestFloor13","5",4,"user10",10,"TestUnit13" 
"GrpName13","Test Group ",3,"99",99,"Contract99",99,"user99","Another Factory","TestFloor99","99",99,"user99",99,"Unit99" 
相關問題