@Override public Fields deserialize( JsonParser jsonParser, DeserializationContext ctxt ) throws IOException, JsonProcessingException { ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec(); ObjectNode root = mapper.readTree( jsonParser ); Fields fields = Fields.NONE; if( root.has( "kind" ) ) return resolveKind( root.get( "kind" ) ); JsonNode fieldsNodes = root.get( "names" ); JsonNode typesNodes = root.get( "types" ); for( int i = 0; i < fieldsNodes.size(); i++ ) { JsonNode nameNode = fieldsNodes.get( i ); JsonNode typeNode = typesNodes == null ? null : typesNodes.get( i ); Comparable name = nameNode.isNumber() ? nameNode.asInt() : nameNode.asText(); Type type = typeNode != null ? resolveType( typeNode ) : null; Fields current; if( typeNode != null ) current = new Fields( name, type ); else current = new Fields( name ); fields = fields.append( current ); } return fields; }