final Descriptors.FieldDescriptor field,
final JsonParser parser)
throws ReaderException, IOException
{
final JsonToken token = parser.getCurrentToken();
final Type type = field.getType();
switch (token) {
case START_OBJECT:
if (!type.equals(Type.MESSAGE)) {
throw new TypeMismatchException(field.getName(), "OBJECT", type.name());
}
return parseObject(builder.newBuilderForField(field), parser).build();
case VALUE_FALSE:
if (!type.equals(Type.BOOL)) {
throw new TypeMismatchException(field.getName(), "BOOLEAN", type.name());
}
return Boolean.FALSE;
case VALUE_TRUE:
if (!type.equals(Type.BOOL)) {
throw new TypeMismatchException(field.getName(), "BOOLEAN", type.name());
}
return Boolean.TRUE;
case VALUE_NUMBER_FLOAT:
switch (type) {
case DOUBLE:
return Double.valueOf(parser.getDoubleValue());
case FLOAT:
return Float.valueOf(parser.getFloatValue());
default:
throw new TypeMismatchException(field.getName(), "FRACTIONAL", type.name());
}
case VALUE_NUMBER_INT:
switch (type) {
case INT32:
case SINT32:
case UINT32:
case FIXED32:
case SFIXED32:
return Integer.valueOf(parser.getIntValue());
case INT64:
case SINT64:
case UINT64:
case FIXED64:
case SFIXED64:
return Long.valueOf(parser.getLongValue());
case DOUBLE:
return Double.valueOf(parser.getLongValue());
case FLOAT:
return Float.valueOf(parser.getLongValue());
case ENUM:
Descriptors.EnumDescriptor desc = field.getEnumType();
Descriptors.EnumValueDescriptor val
= desc.findValueByNumber(parser.getIntValue());
if (val == null) {
throw new TypeMismatchException(
"Schema/input mismatch, enum " + field.getName()
+ " has no member numbered " + parser.getIntValue());
}
return val;
default:
throw new TypeMismatchException(field.getName(), "NUMBER", type.name());
}
case VALUE_STRING:
switch (type) {
case STRING:
return parser.getText();
case BYTES:
return parser.getBinaryValue();
case ENUM:
Descriptors.EnumDescriptor desc = field.getEnumType();
Descriptors.EnumValueDescriptor val
= desc.findValueByName(parser.getText());
if (val == null) {
throw new TypeMismatchException(
"Schema/input mismatch, enum " + field.getName()
+ " has no member " + parser.getText());
}
return val;
default:
throw new TypeMismatchException(field.getName(), "STRING", type.name());
}
default:
throw new TypeMismatchException(
"Schema/input mismatch, don't know how to parse " + token.name());
}