是否有更优雅的方法将大对象变量传递给jq?

时间:2017-10-03 21:18:24

标签: json linux jq

我有以下JSON输入进行转换(数百个类似对象的数组):

@Captor
private ArgumentCaptor<Iterable<BlockPos>> captor;

@Test
public void test() {
  ...
  LightPropagator propagator = mock(LightPropagator.class);
  FirstLightProcessor proc = makeProcessor(new TestLightBlockAccessImpl(20), propagator);
  proc.updateSkylightFor(cubePos);

  verify(propagator).propagateLight(any(), captor.capture(), any(), any(), any())
  Iterable<BlockPos> actualValues = 
      captor.getAllValues()
           .stream()
           .flatMap(i -> StreamSupport.stream(i.spliterator(), false))
           .collect(toList()); 
  assertThat(actualValues, containsInAnyOrder(expected.toArray(new BlockPos[0])));
}

[{ "Nmarch\u00e9": "2013-90006", "SIRETMandataire": null, "LibelleEntiteMandataire": "R\u00e9gion Bretagne", "SIRETAcheteur": null, "LibelleAcheteur": null, "Nature": null, "Objet": "PBF Formation qualifiante 2013 Monteur en construction bois lot 4", "CodeCPV": null, "Type ": "Services", "Procedure": "MAPA - art 30 - au dessus des seuils", "CodePostalCommuneExecution": 35000.0, "NomCommuneExecution": "Rennes", "CodeINSEEExecution": null, "GranulariteINSEEExecution": null, "MillesimeMandatement": 2013, "DateNotification": "2013-10-01", "Montant mandate TTC": 245526, "Montant mandate HT": null, "Montant attribue TTC": 245526, "Montant attribue HT": null, "Date de cloture": null, "Duree": null, "SIRETContractant": 300599123, "DenominationSociale": "AFPA DIRECTION REGIONALE BRETAGNE", "Role": "Titulaire", "CodePostal": 35208, "Dpt ID ": 35, "D\u00e9partement": "Ille-et-Vilaine", "Commune": "RENNES", "Taille": "10 000 et plus", "Taille des entreprises par categorie officielle": "Grande entreprise", "Code NAF": 8559, "Libelle NAF": "ENSEIGNEMENT", "Libelle SBA": "Administration publique\/enseignement", "Libelle CCI": "Tertiaire non marchand", "geolocalisation": null } ] 中,我需要通过值映射替换大量无效值。因此,我想将JSON对象提供给我的jq变换,其中无效值为键,右值为值:

Procedure

我想在我的jq转换文件中声明这个对象,但是我没有看到如何使用 { "MAPA - art 28": "Procédure adaptée", "MAPA - art 30 - au dessus des seuils": "Procédure adaptée", "MAPA - art 30 - en dessous des seuils": "Procédure adaptée", "Proc. adaptée/allégée (art.28et30)": "Procédure adaptée", "Procédure adaptée (MAPA)": "Procédure adaptée", "Appel d'offre ouvert": "Appel d'offres ouvert", "appel d'offres ouvert": "Appel d'offres ouvert", "Appel d'offre ouvert (art.33)": "Appel d'offres ouvert", "Appel d'offre restreint": "Appel d'offres restreint", "Achat direct": "Marché négocié sans publicité ni mise en concurrence préalable", "Négocié avec pub (art.35I)": "Procédure négociée avec mise en concurrence préalable", "Procédure négociée après pub": "Procédure négociée avec mise en concurrence préalable", "Procédure négociée après pub.": "Procédure négociée avec mise en concurrence préalable", "Procédure négociée sans pub": "Marché négocié sans publicité ni mise en concurrence préalable", "Procédure négociée sans pub.": "Marché négocié sans publicité ni mise en concurrence préalable", "Marché négocié": "Marché négocié sans publicité ni mise en concurrence préalable", "marché négocié": "Marché négocié sans publicité ni mise en concurrence préalable", "Marché negocié": "Marché négocié sans publicité ni mise en concurrence préalable" } 语法来声明带有外部数据的变量(理想情况下我想将它声明为文件)。因此,我最终使用了bla as var命令行参数。

这样可行(我使用替换值获得JSON输出),但我希望我能拥有更清晰的命令并使其更易于维护:

--argjson

有关您的信息,请参阅jq-filter.jq:

cat temp.json | jq --argjson procedures '{"MAPA - art 28":"Procédure adaptée","MAPA - art 30 - au dessus des seuils":"Procédure adaptée","MAPA - art 30 - en dessous des seuils":"Procédure adaptée","Proc. adaptée/allégée (art.28et30)":"Procédure adaptée","Procédure adaptée (MAPA)":"Procédure adaptée","Appel d\u0027offre ouvert":"Appel d\u0027offres ouvert","appel d\u0027offres ouvert":"Appel d\u0027offres ouvert","Appel d\u0027offre ouvert (art.33)":"Appel d\u0027offres ouvert","Appel d\u0027offre restreint":"Appel d\u0027offres restreint","Achat direct":"Marché négocié sans publicité ni mise en concurrence préalable","Négocié avec pub (art.35I)":"Procédure négociée avec mise en concurrence préalable","Procédure négociée après pub":"Procédure négociée avec mise en concurrence préalable","Procédure négociée après pub.":"Procédure négociée avec mise en concurrence préalable","Procédure négociée sans pub":"Marché négocié sans publicité ni mise en concurrence préalable","Procédure négociée sans pub.":"Marché négocié sans publicité ni mise en concurrence préalable","Marché négocié":"Marché négocié sans publicité ni mise en concurrence préalable","marché négocié":"Marché négocié sans publicité ni mise en concurrence préalable","Marché negocié":"Marché négocié sans publicité ni mise en concurrence préalable"}' -f jq-filter.jq

1 个答案:

答案 0 :(得分:2)

您是否有理由不能使用--slurpfile or --argfile

  

- slurpfile变量名文件名:

     

此选项读取指定文件中的所有JSON文本,并将解析的JSON值数组绑定到给定的全局变量。如果你使用--argfile foo bar运行jq,那么$ foo在程序中可用,并且有一个数组,其元素对应于名为bar的文件中的文本。

     

- argfile变量名文件名:

     

不要使用。请改用--slurpfile。   (此选项类似于--slurpfile,但是当文件只有一个文本时,则使用该文本,否则将使用--slurpfile中的文本数组。)

假设您将映射放入procedures.json,并且稍微更改过滤器:

  procedure: $procedures[0][.Procedure],

然后你可以使用--slurpfile:

$ jq --slurpfile procedures procedures.json -f jq-filter.jq temp.json

或者您使用--argfile(尽管文档说不是)

$ jq --argfile procedures procedures.json -f jq-filter.jq temp.json

您的代码没有任何其他更改。