Skip to content

Commit 8247f24

Browse files
committed
Address feedback from @komamitsu
1 parent 84cbc79 commit 8247f24

File tree

3 files changed

+61
-3
lines changed

3 files changed

+61
-3
lines changed

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackFactory.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class MessagePackFactory
3939
private final MessagePack.PackerConfig packerConfig;
4040
private boolean reuseResourceInGenerator = true;
4141
private boolean reuseResourceInParser = true;
42+
private boolean writeIntegerKeysAsStringKeys = true;
4243
private ExtensionTypeCustomDeserializers extTypeCustomDesers;
4344

4445
public MessagePackFactory()
@@ -74,6 +75,12 @@ public MessagePackFactory setReuseResourceInParser(boolean reuseResourceInParser
7475
return this;
7576
}
7677

78+
public MessagePackFactory setWriteIntegerKeysAsStringKeys(boolean writeIntegerKeysAsStringKeys)
79+
{
80+
this.writeIntegerKeysAsStringKeys = writeIntegerKeysAsStringKeys;
81+
return this;
82+
}
83+
7784
public MessagePackFactory setExtTypeCustomDesers(ExtensionTypeCustomDeserializers extTypeCustomDesers)
7885
{
7986
this.extTypeCustomDesers = extTypeCustomDesers;
@@ -84,7 +91,7 @@ public MessagePackFactory setExtTypeCustomDesers(ExtensionTypeCustomDeserializer
8491
public JsonGenerator createGenerator(OutputStream out, JsonEncoding enc)
8592
throws IOException
8693
{
87-
return new MessagePackGenerator(_generatorFeatures, _objectCodec, out, packerConfig, reuseResourceInGenerator);
94+
return new MessagePackGenerator(_generatorFeatures, _objectCodec, out, packerConfig, reuseResourceInGenerator, writeIntegerKeysAsStringKeys);
8895
}
8996

9097
@Override

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class MessagePackGenerator
5050
private static final ThreadLocal<OutputStreamBufferOutput> messageBufferOutputHolder = new ThreadLocal<>();
5151
private final OutputStream output;
5252
private final MessagePack.PackerConfig packerConfig;
53+
private final boolean writeIntegerKeysAsStringKeys;
5354

5455
private int currentParentElementIndex = -1;
5556
private int currentState = IN_ROOT;
@@ -195,6 +196,7 @@ private MessagePackGenerator(
195196
this.messagePacker = packerConfig.newPacker(out);
196197
this.packerConfig = packerConfig;
197198
this.nodes = new ArrayList<>();
199+
this.writeIntegerKeysAsStringKeys = true;
198200
}
199201

200202
public MessagePackGenerator(
@@ -210,6 +212,24 @@ public MessagePackGenerator(
210212
this.messagePacker = packerConfig.newPacker(getMessageBufferOutputForOutputStream(out, reuseResourceInGenerator));
211213
this.packerConfig = packerConfig;
212214
this.nodes = new ArrayList<>();
215+
this.writeIntegerKeysAsStringKeys = true;
216+
}
217+
218+
public MessagePackGenerator(
219+
int features,
220+
ObjectCodec codec,
221+
OutputStream out,
222+
MessagePack.PackerConfig packerConfig,
223+
boolean reuseResourceInGenerator,
224+
boolean writeIntegerKeysAsStringKeys)
225+
throws IOException
226+
{
227+
super(features, codec);
228+
this.output = out;
229+
this.messagePacker = packerConfig.newPacker(getMessageBufferOutputForOutputStream(out, reuseResourceInGenerator));
230+
this.packerConfig = packerConfig;
231+
this.nodes = new ArrayList<>();
232+
this.writeIntegerKeysAsStringKeys = writeIntegerKeysAsStringKeys;
213233
}
214234

215235
private MessageBufferOutput getMessageBufferOutputForOutputStream(
@@ -516,7 +536,12 @@ private void writeByteArrayTextKey(byte[] text, int offset, int len) throws IOEx
516536
@Override
517537
public void writeFieldId(long id) throws IOException
518538
{
519-
addKeyNode(id);
539+
if (this.writeIntegerKeysAsStringKeys) {
540+
super.writeFieldId(id);
541+
}
542+
else {
543+
addKeyNode(id);
544+
}
520545
}
521546

522547
@Override

msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackDataformatForFieldIdTest.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@ protected MapDeserializer withResolved(KeyDeserializer keyDeser, TypeDeserialize
8787
public void testMixedKeys()
8888
throws IOException
8989
{
90-
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory())
90+
ObjectMapper mapper = new ObjectMapper(
91+
new MessagePackFactory()
92+
.setWriteIntegerKeysAsStringKeys(false)
93+
)
9194
.registerModule(new SimpleModule()
9295
.addDeserializer(Map.class, new MessagePackMapDeserializer()));
9396

@@ -103,4 +106,27 @@ public void testMixedKeys()
103106

104107
assertEquals(expected, actual);
105108
}
109+
110+
@Test
111+
public void testMixedKeysBackwardsCompatiable()
112+
throws IOException
113+
{
114+
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory())
115+
.registerModule(new SimpleModule()
116+
.addDeserializer(Map.class, new MessagePackMapDeserializer()));
117+
118+
Map<Object, Object> map = new HashMap<>();
119+
map.put(1, "one");
120+
map.put("2", "two");
121+
122+
byte[] bytes = mapper.writeValueAsBytes(map);
123+
Map<Object, Object> deserializedInit = mapper.readValue(bytes, new TypeReference<Map<Object, Object>>() {});
124+
125+
Map<Object, Object> expected = new HashMap<>();
126+
expected.put("1", "one");
127+
expected.put("2", "two");
128+
Map<Object, Object> actual = new HashMap<>(deserializedInit);
129+
130+
assertEquals(expected, actual);
131+
}
106132
}

0 commit comments

Comments
 (0)