THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
This is achievable by introducing a recursive method, inferSchema(JsonNode jsonValue), which calls itself in order is capable of both 1.) inferring the schema for simple JSON documents, and 2.) making a recursive call to break down JSON documents with complex data types within JSON documents and is equipped with the capability of building nested into their constituent parts and Schemas:
Code Block | ||
---|---|---|
| ||
private Schema inferSchema(JsonNode jsonValue) { switch (jsonValue.getNodeType()) { case NULL: return Schema.OPTIONAL_STRING_SCHEMA; case BOOLEAN: return Schema.BOOLEAN_SCHEMA; case NUMBER: if (jsonValue.isIntegralNumber()) { return Schema.INT64_SCHEMA; } else { return Schema.FLOAT64_SCHEMA; } case ARRAY: SchemaBuilder arrayBuilder = SchemaBuilder.array(jsonValue.elements().hasNext() ? inferSchema(jsonValue.elements().next()) : Schema.OPTIONAL_STRING_SCHEMA); return arrayBuilder.build(); case OBJECT: SchemaBuilder structBuilder = SchemaBuilder.struct(); Iterator<Map.Entry<String, JsonNode>> it = jsonValue.fields(); while (it.hasNext()) { Map.Entry<String, JsonNode> entry = it.next(); structBuilder.field(entry.getKey(), inferSchema(entry.getValue())); } return structBuilder.build(); case STRING: return Schema.STRING_SCHEMA; case BINARY: case MISSING: case POJO: default: return null; } } |
...