66import com .fasterxml .jackson .annotation .JsonProperty ;
77import com .fasterxml .jackson .annotation .JsonPropertyOrder ;
88import com .fasterxml .jackson .core .JsonParser ;
9+ import com .fasterxml .jackson .core .JsonToken ;
10+ import com .fasterxml .jackson .databind .ObjectReader ;
911import com .fasterxml .jackson .dataformat .protobuf .schema .ProtobufSchema ;
1012
1113public class ReadNestedUnknownFieldsTest extends ProtobufTestBase
@@ -124,7 +126,7 @@ public static class Embed {
124126
125127 private final ProtobufMapper MAPPER = new ProtobufMapper ();
126128
127- // [dataformats-binary#108]
129+ // [dataformats-binary#108], [dataformats-binary#584]
128130 public void testMultipleUnknown () throws Exception
129131 {
130132 MoreNestedField moreNestedField = new MoreNestedField ();
@@ -133,15 +135,36 @@ public void testMultipleUnknown() throws Exception
133135 nestedTwoField .setNested2 (2 );
134136 moreNestedField .setF1 (nestedTwoField );
135137
136- byte [] in = MAPPER .writerFor (MoreNestedField .class )
138+ byte [] doc = MAPPER .writerFor (MoreNestedField .class )
137139 .with (MAPPER .generateSchemaFor (MoreNestedField .class ))
138140 .writeValueAsBytes (moreNestedField );
141+ final ProtobufSchema schema = MAPPER .generateSchemaFor (LessNestedField .class );
142+ final ObjectReader protoR = MAPPER .readerFor (LessNestedField .class )
143+ .with (schema )
144+ // important: skip through unknown
145+ .with (JsonParser .Feature .IGNORE_UNDEFINED );
146+
147+ // 30-Apr-2025, tatu: [dataformats-binary#584]: First, iterate over tokens
148+ try (JsonParser p = protoR .createParser (doc )) {
149+ assertToken (JsonToken .START_OBJECT , p .nextToken ());
150+ assertToken (JsonToken .FIELD_NAME , p .nextToken ());
151+ assertEquals ("f1" , p .currentName ());
152+ assertToken (JsonToken .START_OBJECT , p .nextToken ());
153+ assertToken (JsonToken .FIELD_NAME , p .nextToken ());
154+ assertEquals ("nested2" , p .currentName ());
155+ assertToken (JsonToken .VALUE_NUMBER_INT , p .nextToken ());
156+ assertEquals (2 , p .getIntValue ());
157+ assertToken (JsonToken .END_OBJECT , p .nextToken ());
158+ assertToken (JsonToken .END_OBJECT , p .nextToken ());
159+ assertNull (p .nextToken ());
160+ }
139161
162+ // and only then test databinding
140163 LessNestedField lesser = MAPPER .readerFor (LessNestedField .class )
141164 .with (MAPPER .generateSchemaFor (LessNestedField .class ))
142165 // important: skip through unknown
143166 .with (JsonParser .Feature .IGNORE_UNDEFINED )
144- .readValue (in );
167+ .readValue (doc );
145168
146169 assertEquals (moreNestedField .getF1 ().getNested2 (), lesser .getF1 ().getNested2 ());
147170 }
0 commit comments