value = deserializeObject(p, ctxt, nodeFactory); break; case JsonTokenId.ID_START_ARRAY: value = deserializeArray(p, ctxt, nodeFactory); break; case JsonTokenId.ID_EMBEDDED_OBJECT: value = _fromEmbedded(p, ctxt, nodeFactory); break; case JsonTokenId.ID_STRING: break; case JsonTokenId.ID_NUMBER_INT: value = _fromInt(p, ctxt, nodeFactory); break; case JsonTokenId.ID_TRUE: break; default: value = deserializeAny(p, ctxt, nodeFactory); _handleDuplicateField(p, ctxt, nodeFactory, key, node, old, value);
return nodeFactory.objectNode(); case JsonTokenId.ID_FIELD_NAME: return deserializeObjectAtName(p, ctxt, nodeFactory); case JsonTokenId.ID_EMBEDDED_OBJECT: return _fromEmbedded(p, ctxt, nodeFactory); case JsonTokenId.ID_STRING: return nodeFactory.textNode(p.getText()); case JsonTokenId.ID_NUMBER_INT: return _fromInt(p, ctxt, nodeFactory); case JsonTokenId.ID_NUMBER_FLOAT: return _fromFloat(p, ctxt, nodeFactory); case JsonTokenId.ID_TRUE: return nodeFactory.booleanNode(true); return (JsonNode) ctxt.handleUnexpectedToken(handledType(), p);
} else { if (!p.hasToken(JsonToken.FIELD_NAME)) { return deserialize(p, ctxt); if (old != null) { if (old instanceof ObjectNode) { JsonNode newValue = updateObject(p, ctxt, (ObjectNode) old); if (newValue != old) { node.set(key, newValue); JsonNode newValue = updateArray(p, ctxt, (ArrayNode) old); if (newValue != old) { node.set(key, newValue); switch (t.id()) { case JsonTokenId.ID_START_OBJECT: value = deserializeObject(p, ctxt, nodeFactory); break; case JsonTokenId.ID_START_ARRAY: value = deserializeArray(p, ctxt, nodeFactory); break; case JsonTokenId.ID_EMBEDDED_OBJECT: value = _fromEmbedded(p, ctxt, nodeFactory); break; case JsonTokenId.ID_STRING: break; case JsonTokenId.ID_NUMBER_INT: value = _fromInt(p, ctxt, nodeFactory);
switch (t.id()) { case JsonTokenId.ID_START_OBJECT: node.add(deserializeObject(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_START_ARRAY: node.add(deserializeArray(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_END_ARRAY: return node; case JsonTokenId.ID_EMBEDDED_OBJECT: node.add(_fromEmbedded(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_STRING: break; case JsonTokenId.ID_NUMBER_INT: node.add(_fromInt(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_TRUE: break; default: node.add(deserializeAny(p, ctxt, nodeFactory)); break;
case JsonTokenId.ID_START_OBJECT: case JsonTokenId.ID_END_OBJECT: // for empty JSON Objects we may point to this return deserializeObject(jp, ctxt, nodeFactory); case JsonTokenId.ID_START_ARRAY: return deserializeArray(jp, ctxt, nodeFactory); case JsonTokenId.ID_FIELD_NAME: return deserializeObject(jp, ctxt, nodeFactory); case JsonTokenId.ID_EMBEDDED_OBJECT: return _fromEmbedded(jp, ctxt, nodeFactory); case JsonTokenId.ID_STRING: return nodeFactory.textNode(jp.getText()); case JsonTokenId.ID_NUMBER_INT: return _fromInt(jp, ctxt, nodeFactory); case JsonTokenId.ID_NUMBER_FLOAT: return _fromFloat(jp, ctxt, nodeFactory); case JsonTokenId.ID_TRUE: return nodeFactory.booleanNode(true); throw ctxt.mappingException(handledType());
protected final ArrayNode deserializeArray(JsonParser jp, DeserializationContext ctxt, final JsonNodeFactory nodeFactory) throws IOException, JsonProcessingException { ArrayNode node = nodeFactory.arrayNode(); while (true) { JsonToken t = jp.nextToken(); if (t == null) { throw ctxt.mappingException("Unexpected end-of-input when binding data into ArrayNode"); } switch (t) { case START_OBJECT: node.add(deserializeObject(jp, ctxt, nodeFactory)); break; case START_ARRAY: node.add(deserializeArray(jp, ctxt, nodeFactory)); break; case END_ARRAY: return node; case VALUE_STRING: node.add(nodeFactory.textNode(jp.getText())); break; default: node.add(deserializeAny(jp, ctxt, nodeFactory)); break; } } }
return deserializeObject(jp, ctxt, nodeFactory); return deserializeArray(jp, ctxt, nodeFactory); return deserializeObject(jp, ctxt, nodeFactory); throw ctxt.mappingException(getValueClass());
/** * Method called when there is a duplicate value for a field. * By default we don't care, and the last value is used. * Can be overridden to provide alternate handling, such as throwing * an exception, or choosing different strategy for combining values * or choosing which one to keep. * * @param fieldName Name of the field for which duplicate value was found * @param objectNode Object node that contains values * @param oldValue Value that existed for the object node before newValue * was added * @param newValue Newly added value just added to the object node */ protected void _handleDuplicateField(JsonParser jp, DeserializationContext ctxt, JsonNodeFactory nodeFactory, String fieldName, ObjectNode objectNode, JsonNode oldValue, JsonNode newValue) throws JsonProcessingException { // [Issue#237]: Report an error if asked to do so: if (ctxt.isEnabled(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY)) { _reportProblem(jp, "Duplicate field '"+fieldName+"' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled"); } // Backwards-compatibility; call in case it's overloaded _handleDuplicateField(fieldName, objectNode, oldValue, newValue); }
case JsonTokenId.ID_START_OBJECT: case JsonTokenId.ID_END_OBJECT: // for empty JSON Objects we may point to this return deserializeObject(jp, ctxt, nodeFactory); case JsonTokenId.ID_START_ARRAY: return deserializeArray(jp, ctxt, nodeFactory); case JsonTokenId.ID_FIELD_NAME: return deserializeObject(jp, ctxt, nodeFactory); case JsonTokenId.ID_EMBEDDED_OBJECT: return _fromEmbedded(jp, ctxt, nodeFactory); case JsonTokenId.ID_STRING: return nodeFactory.textNode(jp.getText()); case JsonTokenId.ID_NUMBER_INT: return _fromInt(jp, ctxt, nodeFactory); case JsonTokenId.ID_NUMBER_FLOAT: return _fromFloat(jp, ctxt, nodeFactory); case JsonTokenId.ID_TRUE: return nodeFactory.booleanNode(true); throw ctxt.mappingException(handledType());
protected final ArrayNode deserializeArray(JsonParser jp, DeserializationContext ctxt, final JsonNodeFactory nodeFactory) throws IOException, JsonProcessingException { ArrayNode node = nodeFactory.arrayNode(); while (true) { JsonToken t = jp.nextToken(); if (t == null) { throw ctxt.mappingException("Unexpected end-of-input when binding data into ArrayNode"); } switch (t) { case START_OBJECT: node.add(deserializeObject(jp, ctxt, nodeFactory)); break; case START_ARRAY: node.add(deserializeArray(jp, ctxt, nodeFactory)); break; case END_ARRAY: return node; case VALUE_STRING: node.add(nodeFactory.textNode(jp.getText())); break; default: node.add(deserializeAny(jp, ctxt, nodeFactory)); break; } } }
return deserializeObject(jp, ctxt, nodeFactory); return deserializeArray(jp, ctxt, nodeFactory); return deserializeObject(jp, ctxt, nodeFactory); throw ctxt.mappingException(getValueClass());
/** * Method called when there is a duplicate value for a field. * By default we don't care, and the last value is used. * Can be overridden to provide alternate handling, such as throwing * an exception, or choosing different strategy for combining values * or choosing which one to keep. * * @param fieldName Name of the field for which duplicate value was found * @param objectNode Object node that contains values * @param oldValue Value that existed for the object node before newValue * was added * @param newValue Newly added value just added to the object node */ protected void _handleDuplicateField(JsonParser jp, DeserializationContext ctxt, JsonNodeFactory nodeFactory, String fieldName, ObjectNode objectNode, JsonNode oldValue, JsonNode newValue) throws JsonProcessingException { // [Issue#237]: Report an error if asked to do so: if (ctxt.isEnabled(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY)) { _reportProblem(jp, "Duplicate field '"+fieldName+"' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled"); } // Backwards-compatibility; call in case it's overloaded _handleDuplicateField(fieldName, objectNode, oldValue, newValue); }
switch (t.id()) { case JsonTokenId.ID_START_OBJECT: node.add(deserializeObject(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_START_ARRAY: node.add(deserializeArray(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_END_ARRAY: return node; case JsonTokenId.ID_EMBEDDED_OBJECT: node.add(_fromEmbedded(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_STRING: break; case JsonTokenId.ID_NUMBER_INT: node.add(_fromInt(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_TRUE: break; default: node.add(deserializeAny(p, ctxt, nodeFactory)); break;
} else { if (!p.hasToken(JsonToken.FIELD_NAME)) { return deserialize(p, ctxt); if (old != null) { if (old instanceof ObjectNode) { JsonNode newValue = updateObject(p, ctxt, (ObjectNode) old); if (newValue != old) { node.set(key, newValue); JsonNode newValue = updateArray(p, ctxt, (ArrayNode) old); if (newValue != old) { node.set(key, newValue); switch (t.id()) { case JsonTokenId.ID_START_OBJECT: value = deserializeObject(p, ctxt, nodeFactory); break; case JsonTokenId.ID_START_ARRAY: value = deserializeArray(p, ctxt, nodeFactory); break; case JsonTokenId.ID_EMBEDDED_OBJECT: value = _fromEmbedded(p, ctxt, nodeFactory); break; case JsonTokenId.ID_STRING: break; case JsonTokenId.ID_NUMBER_INT: value = _fromInt(p, ctxt, nodeFactory);
case JsonTokenId.ID_END_OBJECT: // for empty JSON Objects we may point to this case JsonTokenId.ID_FIELD_NAME: return deserializeObject(p, ctxt, nodeFactory); case JsonTokenId.ID_START_ARRAY: return deserializeArray(p, ctxt, nodeFactory); case JsonTokenId.ID_EMBEDDED_OBJECT: return _fromEmbedded(p, ctxt, nodeFactory); case JsonTokenId.ID_STRING: return nodeFactory.textNode(p.getText()); case JsonTokenId.ID_NUMBER_INT: return _fromInt(p, ctxt, nodeFactory); case JsonTokenId.ID_NUMBER_FLOAT: return _fromFloat(p, ctxt, nodeFactory); case JsonTokenId.ID_TRUE: return nodeFactory.booleanNode(true); return (JsonNode) ctxt.handleUnexpectedToken(handledType(), p);
return nodeFactory.objectNode(); case JsonTokenId.ID_FIELD_NAME: return deserializeObjectAtName(p, ctxt, nodeFactory); case JsonTokenId.ID_EMBEDDED_OBJECT: return _fromEmbedded(p, ctxt, nodeFactory); case JsonTokenId.ID_STRING: return nodeFactory.textNode(p.getText()); case JsonTokenId.ID_NUMBER_INT: return _fromInt(p, ctxt, nodeFactory); case JsonTokenId.ID_NUMBER_FLOAT: return _fromFloat(p, ctxt, nodeFactory); case JsonTokenId.ID_TRUE: return nodeFactory.booleanNode(true); return (JsonNode) ctxt.handleUnexpectedToken(handledType(), p);
value = deserializeObject(p, ctxt, nodeFactory); break; case JsonTokenId.ID_START_ARRAY: value = deserializeArray(p, ctxt, nodeFactory); break; case JsonTokenId.ID_EMBEDDED_OBJECT: value = _fromEmbedded(p, ctxt, nodeFactory); break; case JsonTokenId.ID_STRING: break; case JsonTokenId.ID_NUMBER_INT: value = _fromInt(p, ctxt, nodeFactory); break; case JsonTokenId.ID_TRUE: break; default: value = deserializeAny(p, ctxt, nodeFactory); _handleDuplicateField(p, ctxt, nodeFactory, key, node, old, value);
switch (jp.nextToken()) { case START_OBJECT: value = deserializeObject(jp, ctxt, nodeFactory); break; case START_ARRAY: value = deserializeArray(jp, ctxt, nodeFactory); break; case VALUE_STRING: break; default: value = deserializeAny(jp, ctxt, nodeFactory); _handleDuplicateField(fieldName, node, old, value);
switch (jp.nextToken()) { case START_OBJECT: value = deserializeObject(jp, ctxt, nodeFactory); break; case START_ARRAY: value = deserializeArray(jp, ctxt, nodeFactory); break; case VALUE_STRING: break; default: value = deserializeAny(jp, ctxt, nodeFactory); _handleDuplicateField(fieldName, node, old, value);
switch (t.id()) { case JsonTokenId.ID_START_OBJECT: node.add(deserializeObject(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_START_ARRAY: node.add(deserializeArray(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_END_ARRAY: return node; case JsonTokenId.ID_EMBEDDED_OBJECT: node.add(_fromEmbedded(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_STRING: break; case JsonTokenId.ID_NUMBER_INT: node.add(_fromInt(p, ctxt, nodeFactory)); break; case JsonTokenId.ID_TRUE: break; default: node.add(deserializeAny(p, ctxt, nodeFactory)); break;