From 456f36f98b084e9cabdd0331e0f39afa12170876 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 24 Jul 2019 20:22:52 -0700 Subject: [PATCH] Fixed #140 --- release-notes/VERSION-2.x | 4 ++ .../dataformat/yaml/YAMLGenerator.java | 12 ++++++ .../yaml/ser/GeneratorWithMinimizeTest.java | 38 +++++++++++++++++-- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index b8b1da69..d0a7a4dc 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -8,6 +8,10 @@ Modules: === Releases === ------------------------------------------------------------------------ +2.10.0.pr2 (not yet released) + +#140: (yaml) Implement `JsonGenerator.writeFieldId(...)` for `YAMLGenerator` + 2.10.0.pr1 (19-Jul-2019) #50: (yaml) Empty string serialized without quotes if MINIMIZE_QUOTES is enabled diff --git a/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java b/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java index 9a5b2fc0..cdf31085 100644 --- a/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java +++ b/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java @@ -443,6 +443,18 @@ public final void writeFieldName(SerializableString name) _writeFieldName(name.getValue()); } + @Override // override since 2.10 (method added in 2.8) + public void writeFieldId(long id) throws IOException { + // 24-Jul-2019, tatu: Should not force construction of a String here... + String idStr = Long.valueOf(id).toString(); // since instances for small values cached + if (_writeContext.writeFieldName(idStr) == JsonWriteContext.STATUS_EXPECT_VALUE) { + _reportError("Can not write a field id, expecting a value"); + } + // to avoid quoting +// _writeFieldName(idStr); + _writeScalar(idStr, "int", STYLE_SCALAR); + } + @Override public final void writeStringField(String fieldName, String value) throws IOException diff --git a/yaml/src/test/java/com/fasterxml/jackson/dataformat/yaml/ser/GeneratorWithMinimizeTest.java b/yaml/src/test/java/com/fasterxml/jackson/dataformat/yaml/ser/GeneratorWithMinimizeTest.java index d8a79bff..948e9745 100644 --- a/yaml/src/test/java/com/fasterxml/jackson/dataformat/yaml/ser/GeneratorWithMinimizeTest.java +++ b/yaml/src/test/java/com/fasterxml/jackson/dataformat/yaml/ser/GeneratorWithMinimizeTest.java @@ -1,16 +1,19 @@ package com.fasterxml.jackson.dataformat.yaml.ser; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.*; public class GeneratorWithMinimizeTest extends ModuleTestBase { - private final static YAMLMapper MINIM_MAPPER = new YAMLMapper(); - static { - MINIM_MAPPER.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES); - } + private final ObjectMapper VANILLA_MAPPER = newObjectMapper(); + + private final YAMLMapper MINIM_MAPPER = YAMLMapper.builder() + .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES) + .build(); public void testDefaultSetting() { YAMLFactory f = new YAMLFactory(); @@ -165,4 +168,31 @@ public void testEmptyStringWithMinimizeQuotes() throws Exception assertEquals("---\nkey: \"\"", yaml); } + + // [dataformats-text#140] + public void testNumberKey() throws Exception + { + // First, test with Strings that happen to look like Integer + final Map stringKeyMap = Collections.singletonMap( + "42", "answer"); + // Quoted in both cases + assertEquals("---\n\"42\": \"answer\"", + VANILLA_MAPPER.writeValueAsString(stringKeyMap).trim()); + // but not if minimizing quotes + assertEquals("---\n\"42\": answer", + MINIM_MAPPER.writeValueAsString(stringKeyMap).trim()); + + // And then true Integer keys + + final Map intKeyMap = Collections.singletonMap( + Integer.valueOf(42), "answer"); + + // by default, is quoted + assertEquals("---\n42: \"answer\"", + VANILLA_MAPPER.writeValueAsString(intKeyMap).trim()); + + // but not if minimizing quotes + assertEquals("---\n42: answer", + MINIM_MAPPER.writeValueAsString(intKeyMap).trim()); + } }