我有以下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
答案 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
您的代码没有任何其他更改。