Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I convert String to Map using MapStruct?

I have Story entity in my Spring Boot application. It has String field storyInfo which contains:

{"title":"random title", "description":"random description"}

For my Story entity I have StoryDTO with map field called storyInfo. The question is: how can I convert String field from Strory into Map in StoryDTO using MapStruct?

like image 411
John Salazar Avatar asked Sep 07 '25 14:09

John Salazar


2 Answers

Try following code, inspired from here

@Mapper(componentModel = "spring")
public interface StoryMapper {

      @Mappings({
        @Mapping(source = "storyInfo", target = "storyInfo", qualifiedByName = "fromJsonToMap")
      })
      StoryDTO toStoryDTO(Story story);

      @Mappings({
        @Mapping(source = "storyInfo", target = "storyInfo", qualifiedByName = "fromMapToJson")
      })
      Story toStory(StoryDTO storyDTO);

      @Named("fromJsonToMap")
      default Map<String, Object> fromJsonToMap(String storyInfo) throws IOException {
        if (Objects.nonNull(storyInfo)) {
            ObjectMapper objectMapper = new ObjectMapper();
            Map<String, Double> result = objectMapper.readValue(storyInfo, new TypeReference<Map<String, Object>>() {});
            return result;
        }
        return null;
      }

      @Named("fromMapToJson")
      default String fromMapToJson(Map<String, Object> storyInfo) throws JsonProcessingException {
        if (Objects.nonNull(storyInfo)) {
            ObjectMapper objectMapper = new ObjectMapper();
            String result = objectMapper.writeValueAsString(storyInfo);
            return result;
        }
        return null;
      }

}
like image 154
seytzhan Avatar answered Sep 10 '25 05:09

seytzhan


Thank you guys for answers. Found the easiest solution for me by adding few manual mappers to MapStruct's StoryMapper interface.

// Manual convert to Map
default Map toMap(String text){
    Map map = new HashMap();
    try {
        map = new ObjectMapper().readValue(text, new TypeReference<Map<String, String>>(){});
    } catch (IOException e) {
        e.printStackTrace();
    }

    return map;
}

// Manual convery from map
default String fromMap(Map map){
    return new JSONObject(map).toString();
}
like image 42
John Salazar Avatar answered Sep 10 '25 05:09

John Salazar