Skip to content

Commit 690ec24

Browse files
authored
Fix #584 (#586)
1 parent 78bbc61 commit 690ec24

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ permissions:
2121

2222
jobs:
2323
build:
24-
runs-on: ${{ matrix.os }}
24+
runs-on: 'ubuntu-latest'
2525
strategy:
2626
fail-fast: false
2727
matrix:
2828
java_version: ['8', '11', '17', '21']
29-
os: ['ubuntu-20.04']
3029
env:
3130
JAVA_OPTS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1"
3231
steps:

protobuf/src/main/java/com/fasterxml/jackson/dataformat/protobuf/ProtobufParser.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,12 @@ private JsonToken _skipUnknownField(int tag, int wireType) throws IOException
971971
continue;
972972
}
973973
_parsingContext.setCurrentName(_currentField.name);
974-
_state = STATE_ROOT_VALUE;
974+
// 30-Apr-2025, tatu: [dataformats-binary#584] may be called for root and nested
975+
if (_state == STATE_NESTED_KEY) {
976+
_state = STATE_NESTED_VALUE;
977+
} else {
978+
_state = STATE_ROOT_VALUE;
979+
}
975980
// otherwise quickly validate compatibility
976981
if (!_currentField.isValidFor(wireType)) {
977982
_reportIncompatibleType(_currentField, wireType);

protobuf/src/test/java/com/fasterxml/jackson/dataformat/protobuf/ReadNestedUnknownFieldsTest.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.fasterxml.jackson.annotation.JsonProperty;
77
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
88
import com.fasterxml.jackson.core.JsonParser;
9+
import com.fasterxml.jackson.core.JsonToken;
10+
import com.fasterxml.jackson.databind.ObjectReader;
911
import com.fasterxml.jackson.dataformat.protobuf.schema.ProtobufSchema;
1012

1113
public 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
}

release-notes/VERSION-2.x

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Active maintainers:
1919
#569: (ion) `IonParser` fails to parse some `long` values saying
2020
they are out of range when they are not
2121
(reported, fix suggested by @seadbrane)
22+
#584: (protobuf) Missing `JsonToken.END_OBJECT` for nested Protobuf Objects
2223
- (ion) Upgrade `ion-java` to 1.11.10 (from 1.11.9)
2324

2425
2.18.3 (28-Feb-2025)

0 commit comments

Comments
 (0)