Thank you for your reply. Yep, my fault, it's just a mve, I actually 
receive an 'Object o' which I need to serialize, that's why i doubt i could 
annotate it as it is received from external source. I mean, i cannot 
annotate fields of this object and would like to avoid modifying it as it 
should be used further in the program. I don't need deserialization, just 
serialization.

On Saturday, April 27, 2024 at 6:27:30 PM UTC+3 Mantas Gridinas wrote:

> Is @JsonSerialize still around? You could annotate fields with that 
> annotation and jackson would delegate serializing those fields to that 
> particular serializer. But your code would remain largely the same - you'd 
> still need to check what to write depending on the field. I suppose you 
> could cheat by having that field be some value interface type Foo, and 
> implementations assigned to that field be FooMap or FooString, where 
> FooString would have dedicated to string serializer. Deserializing on the 
> other hand of such structures is painful, but nothing you couldn't handle 
> with @JsonDeserialize.
>
> On Saturday, April 27, 2024 at 2:08:47 AM UTC Viktor Remennik wrote:
>
>> Hi there!
>>
>> I hope it's a simple question but I cannot find an answer myself. So, 
>> asking for help.
>> I need to implement custom map serializer when mam mets some condition. 
>> the problem is, that I need to replace the map with a primitive type, e.g. 
>> string. As a simple example - when map conforms to some rule I want to 
>> replace it with, let's say, string value. I understand there could be at 
>> least one case when primitive, like string, cannot be used witout a key. 
>> It's probably if the map is the root node.Maybe I could generate a key for 
>> such a case? 
>> Anyways, I cannot achieve it in any way I tried. Here's the MVE for my 
>> question. I want to make it producing this:
>> {
>>   "Second" : "Two",
>>   "Third" : "magic string",
>>   "First" : 1
>> }
>>
>> instead of default:
>>
>> {
>>   "Second" : "Two",
>>   "Third" : {
>>     "Eleventh" : 11,
>>     "Twelfth" : "12"
>>   },
>>   "First" : 1
>> }
>>
>> Here's the mve itself. Thank you!
>>
>>
>> public class MapParseTest
>>
>> {
>>
>>     private final ObjectMapper mapper;
>>
>>
>>     public MapParseTest()
>>
>>     {
>>
>>         mapper = new ObjectMapper();
>>
>>         SimpleModule module = new SimpleModule();
>>
>>         module.setSerializerModifier(new MyMapSerializerModifier());
>>
>>         mapper.registerModule(module);
>>
>>     }
>>
>>
>>     public void doTest() throws JsonProcessingException
>>
>>     {
>>
>>         MyMap map1 = new MyMap();
>>
>>         MyMap map2 = new MyMap();
>>
>>
>>         map1.setName("shtame");
>>
>>         map2.setName("magic name");
>>
>>
>>         map1.put("First", 1);
>>
>>         map1.put("Second", "Two");
>>
>>         map1.put("Third", map2);
>>
>>
>>         map2.put("Eleventh", 11);
>>
>>         map2.put("Twelfth", "12");
>>
>>
>>         String result = 
>> mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map1);
>>
>>         System.*out*.println(result);
>>
>>     }
>>
>>
>>     public static void main(String[] args) throws JsonProcessingException
>>
>>     {
>>
>>         MapParseTest test = new MapParseTest();
>>
>>         test.doTest();
>>
>>     }
>>
>>
>>     @Setter
>>
>>     @Getter
>>
>>     public static class MyMap extends HashMap<String, Object>
>>
>>     {
>>
>>         private String name;
>>
>>     }
>>
>>
>>     public static class MyMapSerializer extends JsonSerializer<MyMap>
>>
>>     {
>>
>>         private final JsonSerializer<Object> defaultSerializer;
>>
>>
>>         public MyMapSerializer(JsonSerializer<Object> defaultSerializer)
>>
>>         {
>>
>>             this.defaultSerializer = defaultSerializer;
>>
>>         }
>>
>>
>>         @Override
>>
>>         public void serialize(MyMap value,
>>
>>                               JsonGenerator gen,
>>
>>                               SerializerProvider provider) throws 
>> IOException
>>
>>         {
>>
>>             String className = value.getName();
>>
>>             if (className.equalsIgnoreCase("magic name"))
>>
>>             {
>>
>>                 gen.writeString("magic string");
>>
>>             } else
>>
>>             {
>>
>>                 defaultSerializer.serialize(value, gen, provider);
>>
>>             }
>>
>>         }
>>
>>     }
>>
>>
>>     public static class MyMapSerializerModifier extends 
>> BeanSerializerModifier
>>
>>     {
>>
>>         @Override
>>
>>         public JsonSerializer<?> modifyMapSerializer(SerializationConfig 
>> config,
>>
>>                                                      MapType mapType,
>>
>>                                                      BeanDescription 
>> beanDesc,
>>
>>                                                      JsonSerializer<?> 
>> serializer)
>>
>>         {
>>
>>             Class<?> type = beanDesc.getBeanClass();
>>
>>             if (type.equals(MyMap.class))
>>
>>             {
>>
>>                 return new MyMapSerializer((JsonSerializer<Object>) 
>> serializer);
>>
>>             }
>>
>>             return serializer;
>>
>>         }
>>
>>     }
>>
>> }
>>
>>
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jackson-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jackson-user/94fc521c-0baa-48c2-b104-55262f958f6cn%40googlegroups.com.

Reply via email to