类com.fasterxml.jackson.core.JsonToken源码实例Demo

下面列出了怎么用com.fasterxml.jackson.core.JsonToken的API类实例代码及写法,或者点击链接到github查看源代码。

源代码1 项目: lams   文件: ByteArraySerializer.java
@Override
public void serializeWithType(byte[] value, JsonGenerator g, SerializerProvider provider,
        TypeSerializer typeSer)
    throws IOException
{
    // most likely scalar
    WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
            typeSer.typeId(value, JsonToken.VALUE_EMBEDDED_OBJECT));
    g.writeBinary(provider.getConfig().getBase64Variant(),
            value, 0, value.length);
    typeSer.writeTypeSuffix(g, typeIdDef);

    /* OLD impl
    typeSer.writeTypePrefixForScalar(value, g);
    g.writeBinary(provider.getConfig().getBase64Variant(),
            value, 0, value.length);
    typeSer.writeTypeSuffixForScalar(value, g);
    */
}
 
源代码2 项目: kripton   文件: AbstractPrimitiveBindTransform.java
@Override
public void generateParseOnJacksonAsString(BindTypeContext context, MethodSpec.Builder methodBuilder, String parserName, TypeName beanClass, String beanName, BindProperty property) {
	if (nullable && property.isNullable()) {
		methodBuilder.beginControlFlow("if ($L.currentToken()!=$T.VALUE_NULL)", parserName, JsonToken.class);
	}

	if (property.hasTypeAdapter()) {
		// there's an type adapter
		methodBuilder.addCode("// using type adapter $L\n", property.typeAdapter.adapterClazz);

		methodBuilder.addStatement(setter(beanClass, beanName, property, PRE_TYPE_ADAPTER_TO_JAVA + "$T.read$L($L.getText(), $L)" + POST_TYPE_ADAPTER), TypeAdapterUtils.class,
				TypeUtility.typeName(property.typeAdapter.adapterClazz), PrimitiveUtils.class, PRIMITIVE_UTILITY_TYPE, parserName, DEFAULT_VALUE);
	} else {
		// without type adapter
		methodBuilder.addStatement(setter(beanClass, beanName, property, "$T.read$L($L.getText(), $L)"), PrimitiveUtils.class, PRIMITIVE_UTILITY_TYPE, parserName, DEFAULT_VALUE);
	}

	if (nullable && property.isNullable()) {
		methodBuilder.endControlFlow();
	}
}
 
源代码3 项目: dropbox-sdk-java   文件: JsonReader.java
/**
 * Helper to read and parse the optional ".tag" field. If one is found, positions the parser
 * at the next field (or the closing brace); otherwise leaves the parser position unchanged.
 * Returns null if there isn't a ".tag" field; otherwise an array of strings (the tags).
 * Initially the parser must be positioned right after the opening brace.
 */
public static String[] readTags(JsonParser parser)
    throws IOException, JsonReadException
{
    if (parser.getCurrentToken() != JsonToken.FIELD_NAME) {
        return null;
    }
    if (!".tag".equals(parser.getCurrentName())) {
        return null;
    }
    parser.nextToken();
    if (parser.getCurrentToken() != JsonToken.VALUE_STRING) {
        throw new JsonReadException("expected a string value for .tag field", parser.getTokenLocation());
    }
    String tag = parser.getText();
    parser.nextToken();
    return tag.split("\\.");
}
 
源代码4 项目: agrest   文件: GenericConverter.java
@Override
public Object value(JsonNode valueNode) {
	JsonToken type = valueNode.asToken();

	switch (type) {
	case VALUE_NUMBER_INT:
		return valueNode.asInt();
	case VALUE_NUMBER_FLOAT:
		return valueNode.asDouble();
	case VALUE_TRUE:
		return Boolean.TRUE;
	case VALUE_FALSE:
		return Boolean.FALSE;
	case VALUE_NULL:
		return null;
	default:
		return valueNode.asText();
	}
}
 
源代码5 项目: Elasticsearch   文件: JsonXContentParser.java
@Override
public Object objectText() throws IOException {
    JsonToken currentToken = parser.getCurrentToken();
    if (currentToken == JsonToken.VALUE_STRING) {
        return text();
    } else if (currentToken == JsonToken.VALUE_NUMBER_INT || currentToken == JsonToken.VALUE_NUMBER_FLOAT) {
        return parser.getNumberValue();
    } else if (currentToken == JsonToken.VALUE_TRUE) {
        return Boolean.TRUE;
    } else if (currentToken == JsonToken.VALUE_FALSE) {
        return Boolean.FALSE;
    } else if (currentToken == JsonToken.VALUE_NULL) {
        return null;
    } else {
        return text();
    }
}
 
源代码6 项目: olingo-odata4   文件: ClientCsdlLabeledElement.java
@Override
protected ClientCsdlLabeledElement doDeserialize(final JsonParser jp, final DeserializationContext ctxt)
    throws IOException {
  final ClientCsdlLabeledElement element = new ClientCsdlLabeledElement();
  for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
    final JsonToken token = jp.getCurrentToken();
    if (token == JsonToken.FIELD_NAME) {
      if ("Name".equals(jp.getCurrentName())) {
        element.setName(jp.nextTextValue());
      } else if ("Annotation".equals(jp.getCurrentName())) {
        element.getAnnotations().add(jp.readValueAs(ClientCsdlAnnotation.class));
      } else {
        element.setValue(jp.readValueAs(ClientCsdlDynamicExpression.class));
      }
    }
  }
  return element;
}
 
源代码7 项目: agrest   文件: CayenneExpParser.java
private static Object extractValue(JsonNode valueNode) {
    JsonToken type = valueNode.asToken();

    switch (type) {
        case VALUE_NUMBER_INT:
            return valueNode.asInt();
        case VALUE_NUMBER_FLOAT:
            return valueNode.asDouble();
        case VALUE_TRUE:
            return Boolean.TRUE;
        case VALUE_FALSE:
            return Boolean.FALSE;
        case VALUE_NULL:
            return null;
        case START_ARRAY:
            return extractArray(valueNode);
        default:
            // String parameters may need to be parsed further. Defer parsing
            // until it is placed in the context of an expression...
            return valueNode;
    }
}
 
@Override
protected IncludeAnnotations doDeserialize(final JsonParser jp, final DeserializationContext ctxt)
        throws IOException {

  final ClientCsdlIncludeAnnotations member = new ClientCsdlIncludeAnnotations();

  for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
    final JsonToken token = jp.getCurrentToken();
    if (token == JsonToken.FIELD_NAME) {
      if ("TermNamespace".equals(jp.getCurrentName())) {
        member.setTermNamespace(jp.nextTextValue());
      } else if ("Qualifier".equals(jp.getCurrentName())) {
        member.setQualifier(jp.nextTextValue());
      } else if ("TargetNamespace".equals(jp.getCurrentName())) {
        member.setTargetNamespace(jp.nextTextValue());
      }
    }
  }
  return member;
}
 
/**
 * Parses attributes as a Map<String, Double>, used to parse InsightStatistics
 *
 * @return attributes for insight statistics
 * @throws IOException
 */
private Map<String, Double> parseAttributesWithDoubleValues() throws IOException {
    if (jsonParser.nextToken() != JsonToken.START_OBJECT) {
        throw new JsonParseException("Not an Attributes object", jsonParser.getCurrentLocation());
    }

    Map<String, Double> attributes = new HashMap<>();

    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
        String key = jsonParser.getCurrentName();
        Double value = jsonParser.getValueAsDouble();
        attributes.put(key, value);
    }

    return attributes;
}
 
protected String decryptWithJacksonParser(String text, String name, String[] profiles,
		JsonFactory factory) throws IOException {
	Set<String> valsToDecrpyt = new HashSet<String>();
	JsonParser parser = factory.createParser(text);
	JsonToken token;

	while ((token = parser.nextToken()) != null) {
		if (token.equals(JsonToken.VALUE_STRING)
				&& parser.getValueAsString().startsWith(CIPHER_MARKER)) {
			valsToDecrpyt.add(parser.getValueAsString().trim());
		}
	}

	for (String value : valsToDecrpyt) {
		String decryptedValue = decryptValue(value.replace(CIPHER_MARKER, ""), name,
				profiles);
		text = text.replace(value, decryptedValue);
	}

	return text;
}
 
源代码11 项目: vespa   文件: VespaSimpleJsonInputFormat.java
@Override
public void initialize(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException {
    FileSplit fileSplit = (FileSplit) split;
    FSDataInputStream stream = FileSystem.get(context.getConfiguration()).open(fileSplit.getPath());
    if (fileSplit.getStart() != 0) {
        stream.seek(fileSplit.getStart());
    }

    remaining = fileSplit.getLength();

    JsonFactory factory = new JsonFactory().disable(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES);
    parser = factory.createParser(new BufferedInputStream(stream));
    parser.setCodec(new ObjectMapper());
    parser.nextToken();
    if (parser.currentToken() == JsonToken.START_ARRAY) {
        parser.nextToken();
    }
}
 
源代码12 项目: lams   文件: FactoryBasedEnumDeserializer.java
protected Object deserializeEnumUsingPropertyBased(final JsonParser p, final DeserializationContext ctxt,
		final PropertyBasedCreator creator) throws IOException
{
    PropertyValueBuffer buffer = creator.startBuilding(p, ctxt, null);

    JsonToken t = p.getCurrentToken();
    for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) {
        String propName = p.getCurrentName();
        p.nextToken(); // to point to value

        SettableBeanProperty creatorProp = creator.findCreatorProperty(propName);
        if (creatorProp != null) {
            buffer.assignParameter(creatorProp, _deserializeWithErrorWrapping(p, ctxt, creatorProp));
            continue;
        }
        if (buffer.readIdProperty(propName)) {
            continue;
        }
    }
    return creator.build(ctxt, buffer);
}
 
public CreateApplicationResult unmarshall(JsonUnmarshallerContext context) throws Exception {
  CreateApplicationResult createApplicationResult = new CreateApplicationResult();

  int originalDepth = context.getCurrentDepth();
  String currentParentElement = context.getCurrentParentElement();
  int targetDepth = originalDepth + 1;

  JsonToken token = context.getCurrentToken();
  if (token == null)
    token = context.nextToken();
  if (token == VALUE_NULL) {
    return createApplicationResult;
  }

  while (true) {
    if (token == null)
      break;

    createApplicationResult.setApplication(ApplicationJsonUnmarshaller.getInstance().unmarshall(context));
    token = context.nextToken();
  }

  return createApplicationResult;
}
 
源代码14 项目: vavr-jackson   文件: TupleDeserializer.java
@Override
public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
    List<Object> list = new ArrayList<>();
    int ptr = 0;

    for (JsonToken jsonToken = p.nextToken(); jsonToken != END_ARRAY; jsonToken = p.nextToken()) {
        if (ptr >= deserializersCount()) {
            throw mappingException(ctxt, javaType.getRawClass(), jsonToken);
        }
        JsonDeserializer<?> deserializer = deserializer(ptr++);
        Object value = (jsonToken != VALUE_NULL) ? deserializer.deserialize(p, ctxt) : deserializer.getNullValue(ctxt);
        list.add(value);
    }
    if (list.size() == deserializersCount()) {
        return create(list, ctxt);
    } else {
        throw mappingException(ctxt, javaType.getRawClass(), null);
    }
}
 
源代码15 项目: vespa   文件: MapReader.java
@SuppressWarnings({ "rawtypes", "cast", "unchecked" })
public static void fillMapFromObject(TokenBuffer buffer, MapFieldValue parent) {
    JsonToken token = buffer.currentToken();
    int initNesting = buffer.nesting();
    expectObjectStart(token);
    token = buffer.next();
    DataType keyType = parent.getDataType().getKeyType();
    DataType valueType = parent.getDataType().getValueType();
    while (buffer.nesting() >= initNesting) {
        FieldValue key = readAtomic(buffer.currentName(), keyType);
        FieldValue value = readSingleValue(buffer, valueType);

        Preconditions.checkState(key != null && value != null, "Missing key or value for map entry.");
        parent.put(key, value);
        token = buffer.next();
    }
    expectObjectEnd(token);
}
 
源代码16 项目: heroic   文件: AggregationOrListDeserializer.java
@Override
public AggregationOrList deserialize(final JsonParser p, final DeserializationContext c)
    throws IOException {
    switch (p.getCurrentToken()) {
        case START_ARRAY:
            final List<Aggregation> chain = p.readValueAs(LIST_OF_AGGREGATIONS);
            return new AggregationOrList(Aggregations.chain(chain));
        case START_OBJECT:
            return new AggregationOrList(Optional.of(p.readValueAs(Aggregation.class)));
        default:
            throw c.wrongTokenException(p, JsonToken.START_OBJECT, null);
    }
}
 
源代码17 项目: emodb   文件: AbstractEmoFieldUDF.java
/**
 * Don't materialize the entire parser content, do a targeted search for the value that matches the path.
 */
private boolean moveParserToField(JsonParser parser, String path)
        throws IOException {
    List<String> segments = getFieldPath(path);

    for (String segment : segments) {
        if (parser.getCurrentToken() != JsonToken.START_OBJECT) {
            // Always expect the path to be fields in a JSON map
            return false;
        }

        boolean found = false;

        JsonToken currentToken = parser.nextToken();
        while (!found && currentToken != JsonToken.END_OBJECT) {
            if (currentToken != JsonToken.FIELD_NAME) {
                // This should always be a field.  Something is amiss.
                throw new IOException("Field not found at expected location");
            }
            String fieldName = parser.getText();
            if (fieldName.equals(segment)) {
                // Move to the next token, which is the field value
                found = true;
                currentToken = parser.nextToken();
            } else {
                parser.nextValue();
                currentToken = skipValue(parser);
            }
        }

        if (!found) {
            // Field was not found
            return false;
        }
    }

    // The current location in the parser is the value.
    return true;
}
 
源代码18 项目: kripton   文件: BindBeanSharedPreferences.java
/**
 * for attribute valueCharacterSet parsing
 */
protected Set<Character> parseValueCharacterSet(String input) {
  if (input==null) {
    return null;
  }
  KriptonJsonContext context=KriptonBinder.jsonBind();
  try (JacksonWrapperParser wrapper=context.createParser(input)) {
    JsonParser jacksonParser=wrapper.jacksonParser;
    // START_OBJECT
    jacksonParser.nextToken();
    // value of "element"
    jacksonParser.nextValue();
    Set<Character> result=null;
    if (jacksonParser.currentToken()==JsonToken.START_ARRAY) {
      HashSet<Character> collection=new HashSet<>();
      Character item=null;
      while (jacksonParser.nextToken() != JsonToken.END_ARRAY) {
        if (jacksonParser.currentToken()==JsonToken.VALUE_NULL) {
          item=null;
        } else {
          item=Character.valueOf((char)jacksonParser.getIntValue());
        }
        collection.add(item);
      }
      result=collection;
    }
    return result;
  } catch(Exception e) {
    e.printStackTrace();
    throw(new KriptonRuntimeException(e.getMessage()));
  }
}
 
@Override
protected void add(Intermediate intermediate, JsonParser parser, DeserializationContext ctx)
        throws IOException {
    Object value;
    if (parser.currentToken() == JsonToken.VALUE_NULL) {
        value = null;
    } else if (_typeDeserializerForValue == null) {
        value = _valueDeserializer.deserialize(parser, ctx);
    } else {
        value = _valueDeserializer.deserializeWithType(parser, ctx, _typeDeserializerForValue);
    }
    intermediate.add(value);
}
 
源代码20 项目: dremio-oss   文件: JSONElementLocator.java
private void updatePath(JsonToken token) throws IOException {
  switch (token) {
  case START_ARRAY:
    inc();
    pushArray();
    break;
  case END_ARRAY:
    popArray();
    break;
  case START_OBJECT:
    inc();
    pushObject(null);
    break;
  case END_OBJECT:
    popObject();
    break;
  case FIELD_NAME:
    popObject();
    currentField = parser.getText();
    pushObject(currentField);
    break;
  case VALUE_EMBEDDED_OBJECT:
  case VALUE_FALSE:
  case VALUE_NULL:
  case VALUE_NUMBER_FLOAT:
  case VALUE_NUMBER_INT:
  case VALUE_STRING:
  case VALUE_TRUE:
    inc();
    break;
  case NOT_AVAILABLE:
  default:
    throw new IllegalStateException(token + " " + path);
  }
}
 
private boolean checkDatatypes() throws Exception {
    String contentAsJson = XContentHelper.convertToJson(content, false, XContentType.JSON);
    try (JsonParser parser = factory.createParser(contentAsJson)) {
        JsonToken token = null;
        while ((token = parser.nextToken()) != null) {
            if (token.equals(JsonToken.FIELD_NAME)) {
                String currentName = parser.getCurrentName();
                DataType dataType = allowedKeys.get(currentName);
                if (dataType != null) {
                    JsonToken valueToken = parser.nextToken();
                    switch (dataType) {
                        case STRING:
                            if (!valueToken.equals(JsonToken.VALUE_STRING)) {
                                wrongDatatypes.put(currentName, "String expected");
                            }
                            break;
                        case ARRAY:
                            if (!valueToken.equals(JsonToken.START_ARRAY) && !valueToken.equals(JsonToken.END_ARRAY)) {
                                wrongDatatypes.put(currentName, "Array expected");
                            }
                            break;
                        case OBJECT:
                            if (!valueToken.equals(JsonToken.START_OBJECT) && !valueToken.equals(JsonToken.END_OBJECT)) {
                                wrongDatatypes.put(currentName, "Object expected");
                            }
                            break;
                    }
                }
            }
        }
        return wrongDatatypes.isEmpty();
    }
}
 
源代码22 项目: kripton   文件: Bean2Table.java
/**
 * for attribute valueEnumTypeSet parsing
 */
public static HashSet<EnumType> parseValueEnumTypeSet(byte[] input) {
  if (input==null) {
    return null;
  }
  KriptonJsonContext context=KriptonBinder.jsonBind();
  try (JacksonWrapperParser wrapper=context.createParser(input)) {
    JsonParser jacksonParser=wrapper.jacksonParser;
    // START_OBJECT
    jacksonParser.nextToken();
    // value of "element"
    jacksonParser.nextValue();
    HashSet<EnumType> result=null;
    if (jacksonParser.currentToken()==JsonToken.START_ARRAY) {
      HashSet<EnumType> collection=new HashSet<>();
      EnumType item=null;
      while (jacksonParser.nextToken() != JsonToken.END_ARRAY) {
        if (jacksonParser.currentToken()==JsonToken.VALUE_NULL) {
          item=null;
        } else {
           {
            String tempEnum=jacksonParser.getText();
            item=StringUtils.hasText(tempEnum)?EnumType.valueOf(tempEnum):null;
          }
        }
        collection.add(item);
      }
      result=collection;
    }
    return result;
  } catch(Exception e) {
    e.printStackTrace();
    throw(new KriptonRuntimeException(e.getMessage()));
  }
}
 
源代码23 项目: CloverETL-Engine   文件: JsonSaxParser.java
public void convertJSON2XML(Reader in,Writer out,boolean firstObjectOnly,boolean suppresNodeValues)throws IOException, SAXException{
	this.handler=new JSON2XMLHandler(out,suppresNodeValues);
	JsonParser parser;
	try {
		parser = JSON_FACTORY.createJsonParser(in);
	} catch (JsonParseException e) {
		throw new IOException(e);
	}
	Deque<JsonToken> tokens = new ArrayDeque<JsonToken>();
	Deque<String> names = new ArrayDeque<String>();
	Deque<Integer> depthCounter = new ArrayDeque<Integer>();
	depthCounter.add(0);
	JsonToken currentToken = null;
	
	xmlEscapeChars=true;
	
	handler.startDocument();
	int startEndCounter = 0;
	while ((currentToken = parser.nextToken()) != null) {
		processToken(currentToken, parser, tokens, names, depthCounter);
		if (currentToken == JsonToken.START_ARRAY || currentToken == JsonToken.START_OBJECT) {
			startEndCounter++;
		} else if (currentToken == JsonToken.END_ARRAY || currentToken == JsonToken.END_OBJECT) {
			startEndCounter--;
		}
		if (startEndCounter == 0) {
			break;
		}
	}
	
	handler.endDocument();
}
 
源代码24 项目: ojai   文件: JsonStreamDocumentReader.java
JsonStreamDocumentReader(JsonDocumentStream stream) {
  containerStack = new Stack<ContainerContext>();
  cachedTokens = new LinkedList<JsonToken>();
  documentStream = stream;
  mapLevel = 0;
  eor = false;
}
 
/**
 * Read the header of an AWS CloudTrail log.
 *
 * @throws JsonParseException if the log could not be parsed.
 * @throws IOException if the log could not be opened or accessed.
 */
protected void readArrayHeader() throws IOException {
    if (jsonParser.nextToken() != JsonToken.START_OBJECT) {
        throw new JsonParseException("Not a Json object", jsonParser.getCurrentLocation());
    }

    jsonParser.nextToken();
    if (!jsonParser.getText().equals(RECORDS)) {
        throw new JsonParseException("Not a CloudTrail log", jsonParser.getCurrentLocation());
    }

    if (jsonParser.nextToken() != JsonToken.START_ARRAY) {
        throw new JsonParseException("Not a CloudTrail log", jsonParser.getCurrentLocation());
    }
}
 
源代码26 项目: openrtb   文件: OpenRtbJsonUtils.java
/**
 * Starts an Object, skipping the '{' token, and if necessary a field name before it.
 */
public static void startObject(JsonParser par) throws IOException {
  JsonToken token = par.getCurrentToken();
  if (token == null || token == JsonToken.FIELD_NAME) {
    token = par.nextToken();
  }
  if (token == JsonToken.START_OBJECT) {
    par.nextToken();
  } else {
    throw new JsonParseException(par, "Expected start of object");
  }
}
 
源代码27 项目: timely   文件: SuggestResponse.java
@Override
public SuggestResponse deserialize(JsonParser p, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
    SuggestResponse response = new SuggestResponse();
    if (p.getCurrentToken() == JsonToken.START_ARRAY) {
        while (p.nextToken() != JsonToken.END_ARRAY) {
            response.addSuggestion(p.getValueAsString());
        }
    }
    return response;
}
 
源代码28 项目: kripton   文件: BeanDaoImpl.java
/**
 * for param parser1 parsing
 */
private BeanInner[] parser1(byte[] input) {
  if (input==null) {
    return null;
  }
  KriptonJsonContext context=KriptonBinder.jsonBind();
  try (JacksonWrapperParser wrapper=context.createParser(input)) {
    JsonParser jacksonParser=wrapper.jacksonParser;
    // START_OBJECT
    jacksonParser.nextToken();
    // value of "element"
    jacksonParser.nextValue();
    BeanInner[] result=null;
    if (jacksonParser.currentToken()==JsonToken.START_ARRAY) {
      ArrayList<BeanInner> collection=new ArrayList<>();
      BeanInner item=null;
      while (jacksonParser.nextToken() != JsonToken.END_ARRAY) {
        if (jacksonParser.currentToken()==JsonToken.VALUE_NULL) {
          item=null;
        } else {
          item=beanInnerBindMap.parseOnJackson(jacksonParser);
        }
        collection.add(item);
      }
      result=CollectionUtils.asArray(collection, new BeanInner[collection.size()]);
    }
    return result;
  } catch(Exception e) {
    e.printStackTrace();
    throw(new KriptonRuntimeException(e.getMessage()));
  }
}
 
public CustomDeserializer() {
  addDeserializer(Custom.class, new JsonDeserializer<Custom>() {

    @Override
    public Custom deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
      assertThat(p.getCurrentToken()).isEqualTo(JsonToken.VALUE_NUMBER_INT);
      return Custom.newBuilder().setValue(p.getIntValue()).build();
    }
  });
}
 
@Override
public T deserialize(JsonParser p, DeserializationContext ctxt)
        throws IOException {
    Intermediate intermediate = createIntermediate();

    if (p.isExpectedStartArrayToken()) {
        JsonToken t;
        while ((t = p.nextToken()) != JsonToken.END_ARRAY) {
            String str;
            if (t == JsonToken.VALUE_STRING) {
                str = p.getText();
            } else {
                CharSequence cs =
                        (CharSequence) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
                str = cs.toString();
            }
            if (str.length() != 1) {
                ctxt.reportInputMismatch(this,
                        "Cannot convert a JSON String of length %d into a char element of " +
                                "char array",
                        str.length());
            }
            add(intermediate, str.charAt(0));
        }
        return finish(intermediate);
    }

    char[] chars = p.getTextCharacters();
    addAll(intermediate, chars, p.getTextOffset(), p.getTextLength());
    return finish(intermediate);
}
 
 同包方法