Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EvaluateJsonPath unable to return a scalar

I'm trying to extract a value from JSON to a flowfile-attribute. When I run the EvaluateJsonPath processor I get an error stating

"Unable to get a scalar value for expression $..fields.storyBoard.stringValue.

Input JSON looks like this:

{
  "name" : "projects/fakedims-0000/databases/(default)/documents/device/0000",
  "fields" : {
    "reportKey" : {
      "stringValue" : "abc123"
    },
    "dateOccured" : {
      "timestampValue" : "2018-10-14T04:00:00Z"
    },
    "storyBoard" : {
      "stringValue" : "https://path/to/media"
    },
    "new" : {
      "integerValue" : "25"
    },
    "name" : {
      "stringValue" : "device one"
    },
    "location" : {
      "geoPointValue" : {
        "latitude" : -78.413751,
        "longitude" : 38.156487
      }
    }
  },
  "createTime" : "2018-10-19T00:02:26.209335Z",
  "updateTime" : "2018-10-19T22:22:24.382136Z"
}

The JSONPath expression is $..fields.storyBoard.stringValue

What I think is happening is that the processor is returning ["https://path/to/media"] rather than just the string.

This is what I get if a evaluate to flowfile-content rather than an attribute. Why? What can I do to fix it?

like image 493
rennyB Avatar asked Oct 23 '18 03:10

rennyB


People also ask

How to return scalar values from a jsonpath in flowfile?

A Return Type of JSON can return scalar values if the provided JsonPath evaluates to the specified value and will be routed as a match.If Destination is 'flowfile-content' and the JsonPath does not evaluate to a defined path, the FlowFile will be routed to 'unmatched' without having its contents modified.

How to determine the value of a jsonpath property?

The value of the property must be a valid JsonPath expression. A Return Type of 'auto-detect' will make a determination based off the configured destination. When 'Destination' is set to 'flowfile-attribute,' a return type of 'scalar' will be used.

How to use the evaluatejsonpath processor?

Step 1:Drag and drop the EvaluateJsonPath processor to canvas. Step 2: Double click the processor to configure, the configuration dialog will be opened as follows, Step 3: Check usage of each property and update those values. Destination: Specifies whether the result of the jsonpath expression should be written as attribute or content.

What is jsonpath not found behavior?

Path Not Found Behavior: Specifies how to handle if given jsonpath expression is not found when destination is set to flow file attribute. Either ignore or send as warning. Null Value Representation: Specifies how to indicate null representation of given json path expression.


Video Answer


1 Answers

Change the Return Type property value to json in EvaluateJsonPath processor, if you are extracting as flowfile-attribute

Return Type property description:

Indicates the desired return type of the JSON Path expressions. Selecting 'auto-detect' will set the return type to 'json' for a Destination of 'flowfile-content', and 'scalar' for a Destination of 'flowfile-attribute'.

enter image description here As you are trying to extract nested key not the key on the root level(ex:name,createTime..), that's the reason why we need to configure the Return Type as Json not as scalar.

In Addition you can use FlattenJson processor(seperator '_') to flatten-out all nested json then use Return Type as auto detect in EvaluateJsonPath processor.

EvaluateJsonConfigs: enter image description here

Output: We are going to have attribute value without enclosing in an array enter image description here

like image 140
notNull Avatar answered Oct 11 '22 22:10

notNull