You should not need to explicitly set the additional module directory to cover 
that location. Is there a reason you can’t use the native Groovy JSON [1] 
parsing? That way you don’t have to download any additional libraries. 

[1] http://groovy-lang.org/json.html# <http://groovy-lang.org/json.html#>

Andy LoPresto
alopre...@apache.org
alopresto.apa...@gmail.com
He/Him
PGP Fingerprint: 70EC B3E5 98A6 5A3F D3C4  BACE 3C6E F65B 2F7D EF69

> On Jun 29, 2020, at 7:41 AM, Myklebust, Bjørn Magnar 
> <bjorn.mykleb...@skatteetaten.no> wrote:
> 
> Andy, just a quick followup on this.
>  
> I wanted to test a groovy-script with this code (not finished by far yet), 
> and the script is placed in the Script Body part of an 
> ExecuteGroovyScript-process in NiFi:
>  
>  
> import org.json.JSONObject
> import org.json.XML
> import org.apache.commons.io.IOUtils
> import java.nio.charset.*
>  
> def flowFile = session.get()
> if (!flowFile) return
>  
> flowFile = session.write(flowFile,
>   {inputStream, outputStream ->
>       def text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
>       def xmlJSONObj = XML.toJSONObject(text);
>       def json = xmlJSONObj.toString();
>       outputStream.write(json.getBytes(StandardCharsets.UTF_8))
>   } as StreamCallback)
>  
> session.transfer(flowFile, ExecuteScript.REL_SUCCESS)
>  
> But when trying to run this I get the message «unable to resolve class 
> org.json.JSONObject @ line 1»
> I have downloaded the jar file from this site:  
> https://repo1.maven.org/maven2/org/json/json/20200518/json-20200518.jar 
> <https://repo1.maven.org/maven2/org/json/json/20200518/json-20200518.jar>
> And placed it in my nifi/lib-directory.
> And the content of this jar you can see in the enclosed png-picture.
>  
> Do I need to set a value for the property Additional Classpath when the 
> jar-file is stored in the lib-directory?
>  
> Thanks,
> Bjørn
>  
>  
> Fra: Andy LoPresto <alopre...@apache.org> 
> Sendt: torsdag 25. juni 2020 19:20
> Til: users@nifi.apache.org
> Emne: Re: Replacing a base64-encoded field in a JSON-document with its 
> decoded/converted value
>  
> Hi Bjørn,
>  
> No, XML to JSON conversion is not an Expression Language feature. You’ll need 
> to either get this data into a flowfile as the complete content to perform 
> the conversion with existing built-in tools, or add that step to your Groovy 
> script. 
>  
> With that additional requirement, I think using the Groovy script to perform 
> those steps in tandem is probably the most performant and logical approach 
> here. 
>  
>  
> Andy LoPresto
> alopre...@apache.org <mailto:alopre...@apache.org>
> alopresto.apa...@gmail.com <mailto:alopresto.apa...@gmail.com>
> He/Him
> PGP Fingerprint: 70EC B3E5 98A6 5A3F D3C4  BACE 3C6E F65B 2F7D EF69
> 
> 
> On Jun 24, 2020, at 11:25 PM, Myklebust, Bjørn Magnar 
> <bjorn.mykleb...@skatteetaten.no <mailto:bjorn.mykleb...@skatteetaten.no>> 
> wrote:
>  
> Thanks Andy.
> The XML-content is around 5 kB-ish.  But I also need to convert the XML to 
> JSON before replacing it back into the original JSON-file.  Can this be done 
> with e.g a ConvertAttribute before the ReplaceText?
>  
> Thanks,
> Bjørn
>  
>  
>  
> Fra: Andy LoPresto <alopre...@apache.org <mailto:alopre...@apache.org>> 
> Sendt: onsdag 24. juni 2020 17:24
> Til: users@nifi.apache.org <mailto:users@nifi.apache.org>
> Emne: Re: Replacing a base64-encoded field in a JSON-document with its 
> decoded/converted value
>  
> Hello Bjørn, 
>  
> If the size of the encoded XML document is small (under ~1 KB), you can 
> extract the Base64-encoded value to a flowfile attribute using 
> EvaluateJSONPath, perform the decoding using the base64Decode Expression 
> Language function [1], and then replace it into the flowfile JSON content 
> using ReplaceText (using some regex like "content": ".*" -> “content": 
> ”${decodedXML}” where decodedXML is the name of the attribute you are using). 
>  
> If the XML content could be very large, this will negatively affect your 
> performance, as attributes are stored directly in memory and handling large 
> amounts of data will impact the heap. In this case, I would recommend writing 
> a Groovy script in ExecuteScript processor to leverage Groovy’s very friendly 
> JSON handling and extract the value, Base64 decode it, and replace it in a 
> couple lines. 
>  
> Hope this helps. 
>  
>  
> [1] 
> https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html#base64decode
>  
> <https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html#base64decode>
>  
> Andy LoPresto
> alopre...@apache.org <mailto:alopre...@apache.org>
> alopresto.apa...@gmail.com <mailto:alopresto.apa...@gmail.com>
> He/Him
> PGP Fingerprint: 70EC B3E5 98A6 5A3F D3C4  BACE 3C6E F65B 2F7D EF69
> 
> 
> 
> On Jun 24, 2020, at 4:24 AM, Myklebust, Bjørn Magnar 
> <bjorn.mykleb...@skatteetaten.no <mailto:bjorn.mykleb...@skatteetaten.no>> 
> wrote:
>  
>  
> Hi.
> I have a set of Json-files which contain a base64-coded field (Jsonpath to 
> this field is $.data.content), and this field contains a XML-document.  
> Decoding the field works as expected, so does the conversion from xml to 
> json,  and I'm able to write the content from this field to a file in a 
> bucket in S3.  But what I would like to do is to be able to replace the coded 
> value for this field in the original file with the decoded/converted value in 
> stead of writing the decoded/converted value to file. And after replacing the 
> json-value then I can write the updated Json-file to a new S3 bucket.
> My process look like this at the moment, and works fine for getting the data 
> to file, but it's missing the last part of replacing $.data.content with the 
> decoded/converted data.
>  
> So how can I do the last part?
>  
> <pastedImage.png>
>  
> The EvaluedJsonPath looks like this:
>  
> <EvaluateJsonPath.png>
> 
>  
> The ReplaceText looks like this:
>  
> <ReplaceText.png>
> 
> The Base64EncodeContent looks like this:
>  
> <Base64Decode.png>
> 
> and finally, the CovertRecord looks like this:
>  
> <ConvertRecord.png>
> 
>  
>  
> This is a testfile for that I'm working with:
>  
> {
>   "header": {
>     "dokumentidentifikator": null,
>     "dokumentidentifikatorV2": "dcff985b-c652-4085-b8f1-45a2f4b6d150",
>     "revisjonsnummer": 1,
>     "dokumentnavn": 
> "Engangsavgiftfastsettelse:55TEST661122334455:44BIL1:2017-10-20",
>     "dokumenttype": "SKATTEMELDING_ENGANGSAVGIFT",
>     "dokumenttilstand": "OPPRETTET",
>     "gyldig": true,
>     "gjelderInntektsaar": 2017,
>     "gjelderPeriode": "2017_10",
>     "gjelderPart": {
>       "partsnummer": 5544332211,
>       "identifiseringstype": "MASKINELL",
>       "identifikator": null
>     },
>     "opphavspart": {
>       "partsnummer": 5544332211,
>       "identifikator": null
>     },
>     "kildereferanse": {
>       "kildesystem": "ENGANGSAVGIFTFASTSETTELSE",
>       "gruppe": "",
>       "referanse": "aef147fb-8ce8-43ef-833b-7aa3bac1ece0",
>       "tidspunkt": "2018-01-16T13:28:02.49+01:00"
>     }
>   },
>   "data": {
>     "metadata": {
>       "format": "ske:fastsetting:motorvogn:motorvognavgift:v1",
>       "bytes": 4420,
>       "mimeType": "application/xml",
>       "sha1": "c0AowOsTdNdo6VufeSsZqTphc0Y="
>     },
>     "content": 
> "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8bW90b3J2b2duYXZnaWZ0IHhtbG5zPSJza2U6ZmFzdHNldHRpbmc6bW90b3J2b2duOm1vdG9ydm9nbmF2Z2lmdDp2MSI+CiAgICA8YXZnaWZ0c2xpbmplPgogICAgICAgIDxhdmdpZnRzYmVsb2VwPjU0Mjg5Ni4wMDwvYXZnaWZ0c2JlbG9lcD4KICAgICAgICA8YXZnaWZ0c29wcGx5c25pbmc+CiAgICAgICAgICAgIDxzYWVyYXZnaWZ0VHlwZWtvZGU+QkI8L3NhZXJhdmdpZnRUeXBla29kZT4KICAgICAgICAgICAgPHNhZXJhdmdpZnRHcnVwcGVrb2RlPlg8L3NhZXJhdmdpZnRHcnVwcGVrb2RlPgogICAgICAgIDwvYXZnaWZ0c29wcGx5c25pbmc+CiAgICAgICAgPGF2Z2lmdHNkYXRvPjIwMTctMTAtMjA8L2F2Z2lmdHNkYXRvPgogICAgPC9hdmdpZnRzbGluamU+CiAgICA8YmV0YWxpbmdzaW5mb3JtYXNqb24+CiAgICAgICAgPGtpZG51bW1lcj4xMDEwMTAxMDEwMTA8L2tpZG51bW1lcj4KICAgICAgICA8Zm9yZmFsbHNkYXRvPjIwMTctMTAtMjA8L2ZvcmZhbGxzZGF0bz4KICAgICAgICA8ZmFrdHVyYWRhdG8+MjAxNy0xMC0yMDwvZmFrdHVyYWRhdG8+CiAgICAgICAgPHRvdGFsQXZnaWZ0c2JlbG9lcD41NDI4OTYuMDA8L3RvdGFsQXZnaWZ0c2JlbG9lcD4KICAgIDwvYmV0YWxpbmdzaW5mb3JtYXNqb24+CiAgICA8bW90b3J2b2duYXZnaWZ0c3R5cGU+ZW5nYW5nc2F2Z2lmdDwvbW90b3J2b2duYXZnaWZ0c3R5cGU+CiAgICA8dGlkc3N0ZW1wZWw+MjAxOC0wMS0xNiswMTowMDwvdGlkc3N0ZW1wZWw+CiAgICA8Z3J1bm5sYWdGb3JNb3RvcnZvZ25hdmdpZnQ+CiAgICAgICAgPGtqb2VyaW5nZW5zQXJ0PjEwPC9ram9lcmluZ2Vuc0FydD4KICAgICAgICA8a2pvZXJldG9leT4KICAgICAgICAgICAgPGVpZXJza2FwUmVnaXN0cmVydD4yMDE3LTEwLTIwPC9laWVyc2thcFJlZ2lzdHJlcnQ+CiAgICAgICAgICAgIDxmb2Vyc3RlUmVnaXN0cmVyaW5nc2Fhcj4yMDE3PC9mb2Vyc3RlUmVnaXN0cmVyaW5nc2Fhcj4KICAgICAgICAgICAgPGZvZXJzdGVSZWdpc3RyZXJpbmdzZGF0b0lOb3JnZT4yMDE3LTEwLTIwPC9mb2Vyc3RlUmVnaXN0cmVyaW5nc2RhdG9JTm9yZ2U+CiAgICAgICAgICAgIDxram9lcmV0b2V5Z3J1cHBlPjEwMTwva2pvZXJldG9leWdydXBwZT4KICAgICAgICAgICAgPGxlbmdkZT4zOTY0PC9sZW5nZGU+CiAgICAgICAgICAgIDxtb3RvcmVmZmVrdD45NjwvbW90b3JlZmZla3Q+CiAgICAgICAgICAgIDxzbGFndm9sdW0+MTQzPC9zbGFndm9sdW0+CiAgICAgICAgICAgIDxkcml2c3RvZmY+QkVOU0lOPC9kcml2c3RvZmY+CiAgICAgICAgICAgIDxlZ2VudmVrdD4xNTE5PC9lZ2VudmVrdD4KICAgICAgICAgICAgPGVpZXI+CiAgICAgICAgICAgICAgICA8Zm9lZHNlbHNFbGxlckRudW1tZXI+MTEyMjMzNDQ1NTwvZm9lZHNlbHNFbGxlckRudW1tZXI+CiAgICAgICAgICAgICAgICA8cGFydHNudW1tZXI+NTU0NDMzMjIxMTwvcGFydHNudW1tZXI+CiAgICAgICAgICAgICAgICA8bmF2bj5LTEFSQSBLVTwvbmF2bj4KICAgICAgICAgICAgPC9laWVyPgogICAgICAgICAgICA8dGlsbGF0dFRvdGFsdmVrdD4yMTY0PC90aWxsYXR0VG90YWx2ZWt0PgogICAgICAgICAgICA8aHlicmlkPm5laTwvaHlicmlkPgogICAgICAgICAgICA8Y28ydXRzbGlwcD4yNjg8L2NvMnV0c2xpcHA+CiAgICAgICAgICAgIDxub3h1dHNsaXBwPjU5LjQ8L25veHV0c2xpcHA+CiAgICAgICAgICAgIDxram9lcmV0b2V5aWRlbnRpZmlrYXRvcj4KICAgICAgICAgICAgICAgIDxram9lcmV0b2V5VW5pa0lkZW50aWZpa2F0b3I+QUJDREVGR0hJSjwva2pvZXJldG9leVVuaWtJZGVudGlmaWthdG9yPgogICAgICAgICAgICAgICAgPGtqZW5uZW1lcmtlPjQ0QklMMTwva2plbm5lbWVya2U+CiAgICAgICAgICAgICAgICA8dW5kZXJzdGVsbHNudW1tZXI+VU5ERVJTVEVMTDQ0PC91bmRlcnN0ZWxsc251bW1lcj4KICAgICAgICAgICAgPC9ram9lcmV0b2V5aWRlbnRpZmlrYXRvcj4KICAgICAgICA8L2tqb2VyZXRvZXk+CiAgICA8L2dydW5ubGFnRm9yTW90b3J2b2duYXZnaWZ0PgogICAgPGF2Z2lmdHNwbGlrdGlnPgogICAgICAgIDxmb2Vkc2Vsc0VsbGVyRG51bW1lcj4xMTIyMzM0NDU1PC9mb2Vkc2Vsc0VsbGVyRG51bW1lcj4KICAgICAgICA8cGFydHNudW1tZXI+NTU0NDMzMjIxMTwvcGFydHNudW1tZXI+CiAgICA8L2F2Z2lmdHNwbGlrdGlnPgogICAgPGF2Z2lmdHNrb21wb25lbnQ+CiAgICAgICAgPGtvbXBvbmVudD5DbzI8L2tvbXBvbmVudD4KICAgICAgICA8YmVsb2VwPjQ3NTMzNy4yMDwvYmVsb2VwPgogICAgPC9hdmdpZnRza29tcG9uZW50PgogICAgPGF2Z2lmdHNrb21wb25lbnQ+CiAgICAgICAgPGtvbXBvbmVudD5FZ2VudmVrdDwva29tcG9uZW50PgogICAgICAgIDxiZWxvZXA+NjA5NDUuNjQ8L2JlbG9lcD4KICAgIDwvYXZnaWZ0c2tvbXBvbmVudD4KICAgIDxhdmdpZnRza29tcG9uZW50PgogICAgICAgIDxrb21wb25lbnQ+TW90b3JlZmZla3Q8L2tvbXBvbmVudD4KICAgICAgICA8YmVsb2VwPjAuMDA8L2JlbG9lcD4KICAgIDwvYXZnaWZ0c2tvbXBvbmVudD4KICAgIDxhdmdpZnRza29tcG9uZW50PgogICAgICAgIDxrb21wb25lbnQ+Tk94PC9rb21wb25lbnQ+CiAgICAgICAgPGJlbG9lcD40MjEzLjI0PC9iZWxvZXA+CiAgICA8L2F2Z2lmdHNrb21wb25lbnQ+CiAgICA8YXZnaWZ0c2tvbXBvbmVudD4KICAgICAgICA8a29tcG9uZW50PlNsYWd2b2x1bTwva29tcG9uZW50PgogICAgICAgIDxiZWxvZXA+MC4wMDwvYmVsb2VwPgogICAgPC9hdmdpZnRza29tcG9uZW50PgogICAgPGF2Z2lmdHNrb21wb25lbnQ+CiAgICAgICAgPGtvbXBvbmVudD5DbzIgRnJhdHJla2s8L2tvbXBvbmVudD4KICAgICAgICA8YmVsb2VwPjAuMDA8L2JlbG9lcD4KICAgIDwvYXZnaWZ0c2tvbXBvbmVudD4KICAgIDxhdmdpZnRza29tcG9uZW50PgogICAgICAgIDxrb21wb25lbnQ+RWdlbnZla3QgRnJhdHJla2s8L2tvbXBvbmVudD4KICAgICAgICA8YmVsb2VwPjAuMDA8L2JlbG9lcD4KICAgIDwvYXZnaWZ0c2tvbXBvbmVudD4KICAgIDxhdmdpZnRza29tcG9uZW50PgogICAgICAgIDxrb21wb25lbnQ+TW90b3JlZmZla3QgRnJhdHJla2s8L2tvbXBvbmVudD4KICAgICAgICA8YmVsb2VwPjAuMDA8L2JlbG9lcD4KICAgIDwvYXZnaWZ0c2tvbXBvbmVudD4KICAgIDxhdmdpZnRza29tcG9uZW50PgogICAgICAgIDxrb21wb25lbnQ+Tk94IEZyYXRyZWtrPC9rb21wb25lbnQ+CiAgICAgICAgPGJlbG9lcD4wLjAwPC9iZWxvZXA+CiAgICA8L2F2Z2lmdHNrb21wb25lbnQ+CiAgICA8YXZnaWZ0c2tvbXBvbmVudD4KICAgICAgICA8a29tcG9uZW50PlNsYWd2b2x1bSBGcmF0cmVrazwva29tcG9uZW50PgogICAgICAgIDxiZWxvZXA+MC4wMDwvYmVsb2VwPgogICAgPC9hdmdpZnRza29tcG9uZW50PgogICAgPGF2Z2lmdHNrb21wb25lbnQ+CiAgICAgICAgPGtvbXBvbmVudD5DbzIgU3VtPC9rb21wb25lbnQ+CiAgICAgICAgPGJlbG9lcD40NzUzMzcuMjA8L2JlbG9lcD4KICAgIDwvYXZnaWZ0c2tvbXBvbmVudD4KICAgIDxhdmdpZnRza29tcG9uZW50PgogICAgICAgIDxrb21wb25lbnQ+RWdlbnZla3QgU3VtPC9rb21wb25lbnQ+CiAgICAgICAgPGJlbG9lcD42MDk0NS42NDwvYmVsb2VwPgogICAgPC9hdmdpZnRza29tcG9uZW50PgogICAgPGF2Z2lmdHNrb21wb25lbnQ+CiAgICAgICAgPGtvbXBvbmVudD5Nb3RvcmVmZmVrdCBTdW08L2tvbXBvbmVudD4KICAgICAgICA8YmVsb2VwPjAuMDA8L2JlbG9lcD4KICAgIDwvYXZnaWZ0c2tvbXBvbmVudD4KICAgIDxhdmdpZnRza29tcG9uZW50PgogICAgICAgIDxrb21wb25lbnQ+Tk94IFN1bTwva29tcG9uZW50PgogICAgICAgIDxiZWxvZXA+NDIxMy4yNDwvYmVsb2VwPgogICAgPC9hdmdpZnRza29tcG9uZW50PgogICAgPGF2Z2lmdHNrb21wb25lbnQ+CiAgICAgICAgPGtvbXBvbmVudD5TbGFndm9sdW0gU3VtPC9rb21wb25lbnQ+CiAgICAgICAgPGJlbG9lcD4wLjAwPC9iZWxvZXA+CiAgICA8L2F2Z2lmdHNrb21wb25lbnQ+CiAgICA8YXZnaWZ0c2tvbXBvbmVudD4KICAgICAgICA8a29tcG9uZW50PlZyYWtwYW50PC9rb21wb25lbnQ+CiAgICAgICAgPGJlbG9lcD4yNDAwPC9iZWxvZXA+CiAgICA8L2F2Z2lmdHNrb21wb25lbnQ+CiAgICA8YXZnaWZ0c2tvbXBvbmVudD4KICAgICAgICA8a29tcG9uZW50PkJydWtzZnJhZHJhZyAwJTwva29tcG9uZW50PgogICAgICAgIDxiZWxvZXA+MC4wMDwvYmVsb2VwPgogICAgPC9hdmdpZnRza29tcG9uZW50PgogICAgPGZvcmhhYW5kc2JlcmVnbmluZz5mYWxzZTwvZm9yaGFhbmRzYmVyZWduaW5nPgo8L21vdG9ydm9nbmF2Z2lmdD4K"
>   },
>   "extension": null,
>   "skjemaversjon": "v3_0"
> }
>  
>  
>  
>  
> Cheers,
> Bjørn
>  
>  
> Denne e-posten og eventuelle vedlegg er beregnet utelukkende for den 
> institusjon eller person den er rettet til og kan være belagt med lovbestemt 
> taushetsplikt. Dersom e-posten er feilsendt, vennligst slett den og kontakt 
> Skatteetaten. 
> The contents of this email message and any attachments are intended solely 
> for the addressee(s) and may contain confidential information and may be 
> legally protected from disclosure. If you are not the intended recipient of 
> this message, please immediately delete the message and alert the Norwegian 
> Tax Administration.
>  
> <org.json.JSONObject.png><executegroovyscript.png>

Reply via email to