/** * Parse the specified string representation of a value into its schema and value. * * @param value the string form of the value * @return the schema and value; never null, but whose schema and value may be null * @see #convertToString */ public static SchemaAndValue parseString(String value) { if (value == null) { return NULL_SCHEMA_AND_VALUE; } if (value.isEmpty()) { return new SchemaAndValue(Schema.STRING_SCHEMA, value); } Parser parser = new Parser(value); return parse(parser, false); }
protected static SchemaAndValue parse(Parser parser, boolean embedded) throws NoSuchElementException { if (!parser.hasNext()) { return null; if (parser.canConsume(NULL_VALUE)) { return null; if (parser.canConsume(QUOTE_DELIMITER)) { StringBuilder sb = new StringBuilder(); while (parser.hasNext()) { if (parser.canConsume(QUOTE_DELIMITER)) { break; sb.append(parser.next()); if (parser.canConsume(TRUE_LITERAL)) { return TRUE_SCHEMA_AND_VALUE; if (parser.canConsume(FALSE_LITERAL)) { return FALSE_SCHEMA_AND_VALUE; int startPosition = parser.mark(); try { if (parser.canConsume(ARRAY_BEGIN_DELIMITER)) { List<Object> result = new ArrayList<>(); Schema elementSchema = null; while (parser.hasNext()) { if (parser.canConsume(ARRAY_END_DELIMITER)) { Schema listSchema = null; if (elementSchema != null) {
protected boolean isNext(String expected, boolean ignoreLeadingAndTrailingWhitespace) { if (nextToken == null) { if (!hasNext()) { return false; } // There's another token, so consume it nextToken = consumeNextToken(); } if (ignoreLeadingAndTrailingWhitespace) { nextToken = nextToken.trim(); while (nextToken.isEmpty() && canConsumeNextToken()) { nextToken = consumeNextToken().trim(); } } return nextToken.equals(expected); } }
public boolean hasNext() { return nextToken != null || canConsumeNextToken(); }
public boolean canConsume(String expected) { return canConsume(expected, true); }
public String next() { if (nextToken != null) { previousToken = nextToken; nextToken = null; } else { previousToken = consumeNextToken(); } return previousToken; }
public boolean canConsume(String expected, boolean ignoreLeadingAndTrailingWhitespace) { if (isNext(expected, ignoreLeadingAndTrailingWhitespace)) { // consume this token ... nextToken = null; return true; } return false; }