This is an automated email from the ASF dual-hosted git repository.
exceptionfactory pushed a commit to branch support/nifi-1.x
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/support/nifi-1.x by this push:
new b9b5c03b2e NIFI-13542 Added missing Max String Length property for
JSON Readers (#9084)
b9b5c03b2e is described below
commit b9b5c03b2ecb44291c53362841f933dbcbf66297
Author: Mark Bathori <[email protected]>
AuthorDate: Tue Jul 16 18:35:56 2024 +0200
NIFI-13542 Added missing Max String Length property for JSON Readers (#9084)
Signed-off-by: David Handermann <[email protected]>
---
.../apache/nifi/json/AbstractJsonRowRecordReader.java | 2 +-
.../org/apache/nifi/json/JsonPathRowRecordReader.java | 13 ++++++++++---
.../main/java/org/apache/nifi/json/JsonRecordSource.java | 15 ++++++++++-----
.../java/org/apache/nifi/yaml/YamlParserFactory.java | 10 ++++++++--
.../main/java/org/apache/nifi/yaml/YamlRecordSource.java | 5 +++--
.../main/java/org/apache/nifi/json/JsonPathReader.java | 2 +-
.../main/java/org/apache/nifi/json/JsonTreeReader.java | 4 ++--
.../main/java/org/apache/nifi/yaml/YamlTreeReader.java | 16 ++--------------
.../nifi/json/TestInferJsonSchemaAccessStrategy.java | 3 ++-
.../apache/nifi/json/TestJsonTreeRowRecordReader.java | 2 +-
.../apache/nifi/yaml/TestYamlTreeRowRecordReader.java | 3 ++-
11 files changed, 42 insertions(+), 33 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java
index 4d993b6029..0fef6d50c1 100644
---
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java
+++
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/AbstractJsonRowRecordReader.java
@@ -76,7 +76,7 @@ public abstract class AbstractJsonRowRecordReader implements
RecordReader {
.addValidator(StandardValidators.BOOLEAN_VALIDATOR)
.build();
- private static final StreamReadConstraints DEFAULT_STREAM_READ_CONSTRAINTS
= StreamReadConstraints.builder()
+ static final StreamReadConstraints DEFAULT_STREAM_READ_CONSTRAINTS =
StreamReadConstraints.builder()
.maxStringLength(DataUnit.parseDataSize(DEFAULT_MAX_STRING_LENGTH,
DataUnit.B).intValue())
.build();
diff --git
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonPathRowRecordReader.java
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonPathRowRecordReader.java
index 280d64b454..c02552f4c2 100644
---
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonPathRowRecordReader.java
+++
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonPathRowRecordReader.java
@@ -19,11 +19,13 @@ package org.apache.nifi.json;
import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException;
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
+import com.jayway.jsonpath.spi.json.JsonProvider;
import org.apache.nifi.logging.ComponentLog;
import org.apache.nifi.serialization.MalformedRecordException;
import org.apache.nifi.serialization.SimpleRecordSchema;
@@ -48,17 +50,17 @@ import java.util.Map;
import java.util.Optional;
public class JsonPathRowRecordReader extends AbstractJsonRowRecordReader {
- private static final Configuration STRICT_PROVIDER_CONFIGURATION =
Configuration.builder().jsonProvider(new JacksonJsonProvider()).build();
private final ComponentLog logger;
private final LinkedHashMap<String, JsonPath> jsonPaths;
private final InputStream in;
private final RecordSchema schema;
+ private final Configuration providerConfiguration;
public JsonPathRowRecordReader(final LinkedHashMap<String, JsonPath>
jsonPaths, final RecordSchema schema, final InputStream in, final ComponentLog
logger,
final String dateFormat, final String
timeFormat, final String timestampFormat)
throws MalformedRecordException, IOException {
- this(jsonPaths, schema, in, logger, dateFormat, timeFormat,
timestampFormat, false, null);
+ this(jsonPaths, schema, in, logger, dateFormat, timeFormat,
timestampFormat, false, DEFAULT_STREAM_READ_CONSTRAINTS);
}
public JsonPathRowRecordReader(final LinkedHashMap<String, JsonPath>
jsonPaths, final RecordSchema schema, final InputStream in, final ComponentLog
logger,
@@ -72,6 +74,11 @@ public class JsonPathRowRecordReader extends
AbstractJsonRowRecordReader {
this.jsonPaths = jsonPaths;
this.in = in;
this.logger = logger;
+
+ final ObjectMapper objectMapper = new ObjectMapper();
+
objectMapper.getFactory().setStreamReadConstraints(streamReadConstraints);
+ final JsonProvider jsonProvider = new
JacksonJsonProvider(objectMapper);
+ providerConfiguration =
Configuration.builder().jsonProvider(jsonProvider).build();
}
@Override
@@ -90,7 +97,7 @@ public class JsonPathRowRecordReader extends
AbstractJsonRowRecordReader {
return null;
}
- final DocumentContext ctx =
JsonPath.using(STRICT_PROVIDER_CONFIGURATION).parse(jsonNode.toString());
+ final DocumentContext ctx =
JsonPath.using(providerConfiguration).parse(jsonNode.toString());
final Map<String, Object> values = new
HashMap<>(schema.getFieldCount());
for (final Map.Entry<String, JsonPath> entry : jsonPaths.entrySet()) {
diff --git
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonRecordSource.java
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonRecordSource.java
index 5ff735fbdd..904083d820 100644
---
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonRecordSource.java
+++
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-json-record-utils/src/main/java/org/apache/nifi/json/JsonRecordSource.java
@@ -39,15 +39,20 @@ public class JsonRecordSource implements
RecordSource<JsonNode> {
private final StartingFieldStrategy strategy;
public JsonRecordSource(final InputStream in) throws IOException {
- this(in, null, null);
+ this(in, null, null, DEFAULT_STREAM_READ_CONSTRAINTS);
}
- public JsonRecordSource(final InputStream in, final StartingFieldStrategy
strategy, final String startingFieldName) throws IOException {
- this(in , strategy, startingFieldName, new JsonParserFactory());
+ public JsonRecordSource(final InputStream in, StreamReadConstraints
streamReadConstraints) throws IOException {
+ this(in, null, null, streamReadConstraints);
}
- public JsonRecordSource(final InputStream in, final StartingFieldStrategy
strategy, final String startingFieldName, TokenParserFactory
tokenParserFactory) throws IOException {
- jsonParser = tokenParserFactory.getJsonParser(in,
DEFAULT_STREAM_READ_CONSTRAINTS, ALLOW_COMMENTS_ENABLED);
+ public JsonRecordSource(final InputStream in, final StartingFieldStrategy
strategy, final String startingFieldName, StreamReadConstraints
streamReadConstraints) throws IOException {
+ this(in, strategy, startingFieldName, new JsonParserFactory(),
streamReadConstraints);
+ }
+
+ public JsonRecordSource(final InputStream in, final StartingFieldStrategy
strategy, final String startingFieldName, TokenParserFactory tokenParserFactory,
+ StreamReadConstraints streamReadConstraints)
throws IOException {
+ jsonParser = tokenParserFactory.getJsonParser(in,
streamReadConstraints, ALLOW_COMMENTS_ENABLED);
this.strategy = strategy;
if (strategy == StartingFieldStrategy.NESTED_FIELD) {
diff --git
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlParserFactory.java
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlParserFactory.java
index a6df6c198a..9fd65a4638 100644
---
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlParserFactory.java
+++
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlParserFactory.java
@@ -21,12 +21,12 @@ import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import org.apache.nifi.json.TokenParserFactory;
+import org.yaml.snakeyaml.LoaderOptions;
import java.io.IOException;
import java.io.InputStream;
public class YamlParserFactory implements TokenParserFactory {
- private static final YAMLFactory YAML_FACTORY = new YAMLFactory(new
YAMLMapper());
/**
* Get Parser implementation for YAML
@@ -39,6 +39,12 @@ public class YamlParserFactory implements TokenParserFactory
{
*/
@Override
public JsonParser getJsonParser(final InputStream in, final
StreamReadConstraints streamReadConstraints, final boolean allowComments)
throws IOException {
- return YAML_FACTORY.createParser(in);
+ final LoaderOptions loaderOptions = new LoaderOptions();
+
loaderOptions.setCodePointLimit(streamReadConstraints.getMaxStringLength());
+ final YAMLFactory yamlFactory = YAMLFactory.builder()
+ .loaderOptions(loaderOptions)
+ .build();
+
+ return yamlFactory.setCodec(new YAMLMapper()).createParser(in);
}
}
diff --git
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlRecordSource.java
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlRecordSource.java
index f47a591de6..e9a07c0895 100644
---
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlRecordSource.java
+++
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-yaml-record-utils/src/main/java/org/apache/nifi/yaml/YamlRecordSource.java
@@ -16,6 +16,7 @@
*/
package org.apache.nifi.yaml;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import org.apache.nifi.json.JsonRecordSource;
import org.apache.nifi.json.StartingFieldStrategy;
@@ -23,7 +24,7 @@ import java.io.IOException;
import java.io.InputStream;
public class YamlRecordSource extends JsonRecordSource {
- public YamlRecordSource(final InputStream in, final StartingFieldStrategy
strategy, final String startingFieldName) throws IOException {
- super(in, strategy, startingFieldName, new YamlParserFactory());
+ public YamlRecordSource(final InputStream in, final StartingFieldStrategy
strategy, final String startingFieldName, StreamReadConstraints
streamReadConstraints) throws IOException {
+ super(in, strategy, startingFieldName, new YamlParserFactory(),
streamReadConstraints);
}
}
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonPathReader.java
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonPathReader.java
index 297400c3d4..756681c950 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonPathReader.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonPathReader.java
@@ -155,7 +155,7 @@ public class JsonPathReader extends SchemaRegistryService
implements RecordReade
@Override
protected SchemaAccessStrategy getSchemaAccessStrategy(final String
strategy, final SchemaRegistry schemaRegistry, final PropertyContext context) {
- final RecordSourceFactory<JsonNode> jsonSourceFactory = (var, in) ->
new JsonRecordSource(in);
+ final RecordSourceFactory<JsonNode> jsonSourceFactory = (var, in) ->
new JsonRecordSource(in, streamReadConstraints);
final Supplier<SchemaInferenceEngine<JsonNode>> inferenceSupplier = ()
-> new JsonSchemaInference(new TimeValueInference(dateFormat, timeFormat,
timestampFormat));
return SchemaInferenceUtil.getSchemaAccessStrategy(strategy, context,
getLogger(), jsonSourceFactory, inferenceSupplier,
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeReader.java
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeReader.java
index 596b3880bd..8cac1a1d8a 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeReader.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/json/JsonTreeReader.java
@@ -76,8 +76,8 @@ public class JsonTreeReader extends SchemaRegistryService
implements RecordReade
protected volatile String startingFieldName;
protected volatile StartingFieldStrategy startingFieldStrategy;
protected volatile SchemaApplicationStrategy schemaApplicationStrategy;
+ protected volatile StreamReadConstraints streamReadConstraints;
private volatile boolean allowComments;
- private volatile StreamReadConstraints streamReadConstraints;
public static final PropertyDescriptor STARTING_FIELD_STRATEGY = new
PropertyDescriptor.Builder()
.name("starting-field-strategy")
@@ -182,7 +182,7 @@ public class JsonTreeReader extends SchemaRegistryService
implements RecordReade
}
protected RecordSourceFactory<JsonNode> createJsonRecordSourceFactory() {
- return (variables, in) -> new JsonRecordSource(in,
startingFieldStrategy, startingFieldName);
+ return (variables, in) -> new JsonRecordSource(in,
startingFieldStrategy, startingFieldName, streamReadConstraints);
}
@Override
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/yaml/YamlTreeReader.java
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/yaml/YamlTreeReader.java
index 5b8ee2c0c0..abc0820e50 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/yaml/YamlTreeReader.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/yaml/YamlTreeReader.java
@@ -17,13 +17,11 @@
package org.apache.nifi.yaml;
-import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.databind.JsonNode;
import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.Tags;
import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.json.AbstractJsonRowRecordReader;
import org.apache.nifi.json.JsonTreeReader;
import org.apache.nifi.json.JsonTreeRowRecordReader;
import org.apache.nifi.logging.ComponentLog;
@@ -51,17 +49,12 @@ public class YamlTreeReader extends JsonTreeReader {
@Override
protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
- final List<PropertyDescriptor> properties = new
ArrayList<>(super.getSupportedPropertyDescriptors());
- // Remove those properties which are not applicable for YAML
- properties.remove(AbstractJsonRowRecordReader.MAX_STRING_LENGTH);
- properties.remove(AbstractJsonRowRecordReader.ALLOW_COMMENTS);
-
- return properties;
+ return new ArrayList<>(super.getSupportedPropertyDescriptors());
}
@Override
protected RecordSourceFactory<JsonNode> createJsonRecordSourceFactory() {
- return (var, in) -> new YamlRecordSource(in, startingFieldStrategy,
startingFieldName);
+ return (var, in) -> new YamlRecordSource(in, startingFieldStrategy,
startingFieldName, streamReadConstraints);
}
@Override
@@ -70,11 +63,6 @@ public class YamlTreeReader extends JsonTreeReader {
schemaApplicationStrategy, null);
}
- @Override
- protected StreamReadConstraints buildStreamReadConstraints(final
ConfigurationContext context) {
- return StreamReadConstraints.defaults();
- }
-
@Override
protected boolean isAllowCommentsEnabled(final ConfigurationContext
context) {
return ALLOW_COMMENTS_DISABLED;
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestInferJsonSchemaAccessStrategy.java
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestInferJsonSchemaAccessStrategy.java
index 7ef2089fe2..d806e7cd97 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestInferJsonSchemaAccessStrategy.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestInferJsonSchemaAccessStrategy.java
@@ -16,6 +16,7 @@
*/
package org.apache.nifi.json;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.databind.JsonNode;
import org.apache.nifi.logging.ComponentLog;
import org.apache.nifi.schema.inference.InferSchemaAccessStrategy;
@@ -237,7 +238,7 @@ class TestInferJsonSchemaAccessStrategy {
final InputStream bufferedIn = new BufferedInputStream(in)) {
final InferSchemaAccessStrategy<?> accessStrategy = new
InferSchemaAccessStrategy<>(
- (var, content) -> new JsonRecordSource(content, strategy,
startingFieldName),
+ (var, content) -> new JsonRecordSource(content, strategy,
startingFieldName, StreamReadConstraints.defaults()),
timestampInference, Mockito.mock(ComponentLog.class)
);
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
index e8f45cca07..27a1d06c8a 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
@@ -1433,7 +1433,7 @@ class TestJsonTreeRowRecordReader {
private RecordSchema inferSchema(InputStream jsonStream,
StartingFieldStrategy strategy, String startingFieldName) throws IOException {
RecordSchema schema = new InferSchemaAccessStrategy<>(
- (__, inputStream) -> new JsonRecordSource(inputStream, strategy,
startingFieldName),
+ (__, inputStream) -> new JsonRecordSource(inputStream, strategy,
startingFieldName, StreamReadConstraints.defaults()),
new JsonSchemaInference(new TimeValueInference(null, null, null)),
mock(ComponentLog.class)
).getSchema(Collections.emptyMap(), jsonStream, null);
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java
index 214ec837e1..c86e50892b 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/yaml/TestYamlTreeRowRecordReader.java
@@ -17,6 +17,7 @@
package org.apache.nifi.yaml;
+import com.fasterxml.jackson.core.StreamReadConstraints;
import org.apache.avro.Schema;
import org.apache.commons.io.FileUtils;
import org.apache.nifi.avro.AvroTypeUtil;
@@ -1231,7 +1232,7 @@ class TestYamlTreeRowRecordReader {
private RecordSchema inferSchema(InputStream jsonStream,
StartingFieldStrategy strategy, String startingFieldName) throws IOException {
RecordSchema schema = new InferSchemaAccessStrategy<>(
- (__, inputStream) -> new YamlRecordSource(inputStream, strategy,
startingFieldName),
+ (__, inputStream) -> new YamlRecordSource(inputStream, strategy,
startingFieldName, StreamReadConstraints.defaults()),
new JsonSchemaInference(new TimeValueInference(null, null, null)),
mock(ComponentLog.class)
).getSchema(Collections.emptyMap(), jsonStream, null);