2017-07-27 41 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"