Come convertire arbitrariamente semplice JSON in CSV usando jq?

Usando jq , in che modo la codifica JSON arbitraria di una matrice di oggetti superficiali può essere convertita in CSV?

Ci sono un sacco di domande e risposte su questo sito che coprono specifici modelli di dati che codificano i campi, ma le risposte a questa domanda dovrebbero funzionare con qualsiasi JSON, con l’unica restrizione che si tratta di una matrice di oggetti con proprietà scalari (no deep / complex / sotto-oggetti, poiché appiattire questi è un’altra domanda). Il risultato dovrebbe contenere una riga di intestazione che fornisce i nomi dei campi. Sarà data la preferenza alle risposte che conservano l’ordine dei campi del primo object, ma non è un requisito. I risultati possono racchiudere tutte le celle con virgolette doppie o solo racchiudere quelle che richiedono quoting (ad esempio ‘a, b’).

Esempi

  1. Ingresso:

    [ {"code": "NSW", "name": "New South Wales", "level":"state", "country": "AU"}, {"code": "AB", "name": "Alberta", "level":"province", "country": "CA"}, {"code": "ABD", "name": "Aberdeenshire", "level":"council area", "country": "GB"}, {"code": "AK", "name": "Alaska", "level":"state", "country": "US"} ] 

    Uscita ansible:

     code,name,level,country NSW,New South Wales,state,AU AB,Alberta,province,CA ABD,Aberdeenshire,council area,GB AK,Alaska,state,US 

    Uscita ansible:

     "code","name","level","country" "NSW","New South Wales","state","AU" "AB","Alberta","province","CA" "ABD","Aberdeenshire","council area","GB" "AK","Alaska","state","US" 
  2. Ingresso:

     [ {"name": "bang", "value": "!", "level": 0}, {"name": "letters", "value": "a,b,c", "level": 0}, {"name": "letters", "value": "x,y,z", "level": 1}, {"name": "bang", "value": "\"!\"", "level": 1} ] 

    Uscita ansible:

     name,value,level bang,!,0 letters,"a,b,c",0 letters,"x,y,z",1 bang,"""!""",0 

    Uscita ansible:

     "name","value","level" "bang","!","0" "letters","a,b,c","0" "letters","x,y,z","1" "bang","""!""","1"