public void testMultiLevel() throws Exception { JsonParser p1 = JSON_FACTORY.createParser(ObjectReadContext.empty(), "[ 1 ] "); JsonParser p2 = JSON_FACTORY.createParser(ObjectReadContext.empty(), " 5"); JsonParser p3 = JSON_FACTORY.createParser(ObjectReadContext.empty(), " { } "); JsonParserSequence seq1 = JsonParserSequence.createFlattened(true, p1, p2); JsonParserSequence seq = JsonParserSequence.createFlattened(false, seq1, p3); assertEquals(3, seq.containedParsersCount()); assertToken(JsonToken.START_ARRAY, seq.nextToken()); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertToken(JsonToken.END_ARRAY, seq.nextToken()); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertToken(JsonToken.START_OBJECT, seq.nextToken()); assertToken(JsonToken.END_OBJECT, seq.nextToken()); assertNull(seq.nextToken()); assertTrue(p1.isClosed()); assertTrue(p2.isClosed()); assertTrue(p3.isClosed()); assertTrue(seq.isClosed()); }
public void testInitializationDisabled() throws Exception { // // First, with old legacy settings JsonParser p1 = JSON_FACTORY.createParser(ObjectReadContext.empty(), "1 2"); JsonParser p2 = JSON_FACTORY.createParser(ObjectReadContext.empty(), "3 true"); assertToken(JsonToken.VALUE_NUMBER_INT, p1.nextToken()); assertEquals(1, p1.getIntValue()); assertToken(JsonToken.VALUE_NUMBER_INT, p2.nextToken()); assertEquals(3, p2.getIntValue()); // with legacy settings, will see neither '1' nor '3' JsonParserSequence seq = JsonParserSequence.createFlattened(false, p1, p2); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertEquals(2, seq.getIntValue()); assertToken(JsonToken.VALUE_TRUE, seq.nextToken()); assertNull(seq.nextToken()); seq.close(); }
public void testInitializationEnabled() throws Exception { // // and then with new "check for current": JsonParser p1 = JSON_FACTORY.createParser(ObjectReadContext.empty(), "1 2"); JsonParser p2 = JSON_FACTORY.createParser(ObjectReadContext.empty(), "3 true"); assertToken(JsonToken.VALUE_NUMBER_INT, p1.nextToken()); assertEquals(1, p1.getIntValue()); assertToken(JsonToken.VALUE_NUMBER_INT, p2.nextToken()); assertEquals(3, p2.getIntValue()); // with new settings, both '1' and '3' will be visible JsonParserSequence seq = JsonParserSequence.createFlattened(true, p1, p2); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertEquals(1, seq.getIntValue()); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertEquals(2, seq.getIntValue()); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertEquals(3, seq.getIntValue()); assertToken(JsonToken.VALUE_TRUE, seq.nextToken()); assertNull(seq.nextToken()); seq.close(); }
private final Object _deserialize(JsonParser paramJsonParser, DeserializationContext paramDeserializationContext) { boolean bool = paramJsonParser.isExpectedStartArrayToken(); String str = _locateTypeId(paramJsonParser, paramDeserializationContext); JsonDeserializer localJsonDeserializer = _findDeserializer(paramDeserializationContext, str); if ((this._typeIdVisible) && (paramJsonParser.getCurrentToken() == JsonToken.START_OBJECT)) { TokenBuffer localTokenBuffer = new TokenBuffer(null); localTokenBuffer.writeStartObject(); localTokenBuffer.writeFieldName(this._typePropertyName); localTokenBuffer.writeString(str); JsonParserSequence localJsonParserSequence = JsonParserSequence.createFlattened(localTokenBuffer.asParser(paramJsonParser), paramJsonParser); paramJsonParser = localJsonParserSequence; localJsonParserSequence.nextToken(); } Object localObject = localJsonDeserializer.deserialize(paramJsonParser, paramDeserializationContext); if ((bool) && (paramJsonParser.nextToken() != JsonToken.END_ARRAY)) throw paramDeserializationContext.wrongTokenException(paramJsonParser, JsonToken.END_ARRAY, "expected closing END_ARRAY after type information and deserialized value"); return localObject; }
private final Object _deserialize(JsonParser paramJsonParser, DeserializationContext paramDeserializationContext) { if (paramJsonParser.getCurrentToken() != JsonToken.START_OBJECT) throw paramDeserializationContext.wrongTokenException(paramJsonParser, JsonToken.START_OBJECT, "need JSON Object to contain As.WRAPPER_OBJECT type information for class " + baseTypeName()); if (paramJsonParser.nextToken() != JsonToken.FIELD_NAME) throw paramDeserializationContext.wrongTokenException(paramJsonParser, JsonToken.FIELD_NAME, "need JSON String that contains type id (for subtype of " + baseTypeName() + ")"); String str = paramJsonParser.getText(); JsonDeserializer localJsonDeserializer = _findDeserializer(paramDeserializationContext, str); paramJsonParser.nextToken(); if ((this._typeIdVisible) && (paramJsonParser.getCurrentToken() == JsonToken.START_OBJECT)) { TokenBuffer localTokenBuffer = new TokenBuffer(null); localTokenBuffer.writeStartObject(); localTokenBuffer.writeFieldName(this._typePropertyName); localTokenBuffer.writeString(str); JsonParserSequence localJsonParserSequence = JsonParserSequence.createFlattened(localTokenBuffer.asParser(paramJsonParser), paramJsonParser); paramJsonParser = localJsonParserSequence; localJsonParserSequence.nextToken(); } Object localObject = localJsonDeserializer.deserialize(paramJsonParser, paramDeserializationContext); if (paramJsonParser.nextToken() != JsonToken.END_OBJECT) throw paramDeserializationContext.wrongTokenException(paramJsonParser, JsonToken.END_OBJECT, "expected closing END_OBJECT after type information and deserialized value"); return localObject; }
/** * Method that handles type information wrapper, locates actual * subtype deserializer to use, and calls it to do actual * deserialization. */ private final Object _deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { boolean hadStartArray = jp.isExpectedStartArrayToken(); String typeId = _locateTypeId(jp, ctxt); JsonDeserializer<Object> deser = _findDeserializer(ctxt, typeId); // Minor complication: we may need to merge type id in? if (_typeIdVisible && jp.getCurrentToken() == JsonToken.START_OBJECT) { // but what if there's nowhere to add it in? Error? Or skip? For now, skip. TokenBuffer tb = new TokenBuffer(null); tb.writeStartObject(); // recreate START_OBJECT tb.writeFieldName(_typePropertyName); tb.writeString(typeId); jp = JsonParserSequence.createFlattened(tb.asParser(jp), jp); jp.nextToken(); } Object value = deser.deserialize(jp, ctxt); // And then need the closing END_ARRAY if (hadStartArray && jp.nextToken() != JsonToken.END_ARRAY) { throw ctxt.wrongTokenException(jp, JsonToken.END_ARRAY, "expected closing END_ARRAY after type information and deserialized value"); } return value; }
public void testSimple() throws Exception { JsonParser p1 = JSON_FACTORY.createParser(ObjectReadContext.empty(), "[ 1 ]"); JsonParser p2 = JSON_FACTORY.createParser(ObjectReadContext.empty(), "[ 2 ]"); JsonParserSequence seq = JsonParserSequence.createFlattened(false, p1, p2); assertEquals(2, seq.containedParsersCount()); assertFalse(p1.isClosed()); assertFalse(p2.isClosed()); assertFalse(seq.isClosed()); assertToken(JsonToken.START_ARRAY, seq.nextToken()); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertEquals(1, seq.getIntValue()); assertToken(JsonToken.END_ARRAY, seq.nextToken()); assertFalse(p1.isClosed()); assertFalse(p2.isClosed()); assertFalse(seq.isClosed()); assertToken(JsonToken.START_ARRAY, seq.nextToken()); // first parser ought to be closed now assertTrue(p1.isClosed()); assertFalse(p2.isClosed()); assertFalse(seq.isClosed()); assertToken(JsonToken.VALUE_NUMBER_INT, seq.nextToken()); assertEquals(2, seq.getIntValue()); assertToken(JsonToken.END_ARRAY, seq.nextToken()); assertTrue(p1.isClosed()); assertFalse(p2.isClosed()); assertFalse(seq.isClosed()); assertNull(seq.nextToken()); assertTrue(p1.isClosed()); assertTrue(p2.isClosed()); assertTrue(seq.isClosed()); seq.close(); }
/** * Method that handles type information wrapper, locates actual * subtype deserializer to use, and calls it to do actual * deserialization. */ private final Object _deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { // first, sanity checks if (jp.getCurrentToken() != JsonToken.START_OBJECT) { throw ctxt.wrongTokenException(jp, JsonToken.START_OBJECT, "need JSON Object to contain As.WRAPPER_OBJECT type information for class "+baseTypeName()); } // should always get field name, but just in case... if (jp.nextToken() != JsonToken.FIELD_NAME) { throw ctxt.wrongTokenException(jp, JsonToken.FIELD_NAME, "need JSON String that contains type id (for subtype of "+baseTypeName()+")"); } final String typeId = jp.getText(); JsonDeserializer<Object> deser = _findDeserializer(ctxt, typeId); jp.nextToken(); // Minor complication: we may need to merge type id in? if (_typeIdVisible && jp.getCurrentToken() == JsonToken.START_OBJECT) { // but what if there's nowhere to add it in? Error? Or skip? For now, skip. TokenBuffer tb = new TokenBuffer(null); tb.writeStartObject(); // recreate START_OBJECT tb.writeFieldName(_typePropertyName); tb.writeString(typeId); jp = JsonParserSequence.createFlattened(tb.asParser(jp), jp); jp.nextToken(); } Object value = deser.deserialize(jp, ctxt); // And then need the closing END_OBJECT if (jp.nextToken() != JsonToken.END_OBJECT) { throw ctxt.wrongTokenException(jp, JsonToken.END_OBJECT, "expected closing END_OBJECT after type information and deserialized value"); } return value; }
@Override public Object deserializeTypedFromObject(JsonParser p, DeserializationContext ctxt) throws IOException { JsonToken t; t = p.getCurrentToken(); if (t == JsonToken.START_OBJECT) { t = p.nextToken(); } else if (t != JsonToken.FIELD_NAME) { throw new JsonMappingException(p, "Could not extract event type from non-object"); } final TokenBuffer tb = new TokenBuffer(p, ctxt); for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) { final String topLevelProperty = p.getCurrentName(); tb.writeFieldName(topLevelProperty); t = p.nextToken(); if (topLevelProperty.equals("metadata")) { if (t != JsonToken.START_OBJECT) { throw new JsonMappingException(p, "Could not extract event type from invalid metadata"); } tb.writeStartObject(); t = p.nextToken(); for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) { final String metadataProperty = p.getCurrentName(); tb.writeFieldName(metadataProperty); t = p.nextToken(); if (metadataProperty.equals("event_type")) { if (t != JsonToken.VALUE_STRING) { throw new JsonMappingException(p, "Could not extract event type from non-string property"); } final String typeId = p.getText(); tb.writeString(typeId); final JsonParser pb = JsonParserSequence.createFlattened(false, tb.asParser(p), p); return deserialize(pb, ctxt, typeId); } else { tb.copyCurrentStructure(p); } } } else { tb.copyCurrentStructure(p); } } throw new JsonMappingException(p, "Could not find metadata property to extract event type"); }