Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

This is achievable by the introduction of a recursive method, inferSchema(JsonNode jsonValue), which calls itself in order to handle complex data types and is equipped with the capability of building nested Schemas and providing coverage for all JSON documents:

Code Block
titleJsonConverter.java
 privateprivate 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 defaultMISSING:
        case POJO:
       return null;default:
        }    return null;
    }
}

Compatibility, Deprecation, and Migration Plan

...