当前位置: 首页 > 知识库问答 >
问题:

如何使用MapStruct将字符串转换为Map?

乜胜泫
2023-03-14

我的 Spring Boot 应用程序中有 Story 实体。它具有字符串字段 storyInfo,其中包含:

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

对于我的故事实体,我有StoryDTO地图字段称为故事信息。问题是:如何使用MapStructStrory中的Strory字符串字段转换为StoryDTO中的Map?

共有3个答案

沈琛
2023-03-14

已经提供的答案很好地解释了如何提供服务来使用Jackson进行映射。

为了使用MapStruct实现这一点,您可以使用限定符并相应地注释您的服务。

举个例子

@Qualifier // from the MapStruct package
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface FromJson {
}

public interface StringToMapConverter {

    @FromJson
    Map<String, String> convert(String string);
}

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

    @Mapping(target = "storyInfo", qualifiedBy = FromJson.class)
    StoryDTO convert(Story story);
}

< code > StringToMapConverter 的实现应该与已经提供的答案一样。您不必为转换器使用专用接口,您也可以使用抽象映射器,注入< code>ObjectMapper并完成其余相同的操作。

然后,MapStruct 将使用它来将 storyInfo String 转换为地图。

其他一些可能的解决方案,不在问题的范围内,如果您使用Hibernate。您可以使用<code>映射

左丘烨烁
2023-03-14

尝试下面的代码,从这里得到启发

@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;
      }

}
怀晋
2023-03-14

谢谢各位的回答。通过向MapStruct的< code>StoryMapper接口添加一些手动映射器,我找到了最简单的解决方案。

// 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();
}
 类似资料:
  • 我们可以使用StreamApi将上面的字符串转换为字符流吗?

  • 问题内容: 我正在阅读有关python的新f字符串的 博客 ,它们看起来很整洁。但是,我希望能够从字符串或文件中加载f字符串。 我似乎找不到任何执行此操作的字符串方法或其他函数。 从上面我的链接中的示例: 但是,如果我有琴弦怎么办?我希望能够像这样: 事实证明,我已经可以执行类似的操作并获得性能提高。即: 问题答案: f字符串是代码。不仅以安全的方式(当然,字符串文字就是代码),而且以危险的任意代

  • 我是Mapstruct的新手,我正在努力正确理解它。 我想实现的是从DTO字符串参数(carModel)转换为他的实体,使用服务和存储库进行检索。 问题是Mapstruct生成的Mapper类正在尝试向Service类注入注释,但它不起作用。服务为空。 这是我的课程: 类: 类: DTO和实体类: 构建工作正常,但当我尝试使用Mapper时,应用程序停止。它说carModelService是空的。

  • 我正在尝试从json转换为Java对象。我收到一个json字符串,其中包括一个书籍列表: 我创建了一个名为Books的对象: 另外,我正在使用doGet方法从RESTful webservice中以以下方式检索这些数据: 干杯

  • 问题内容: 我有一个,我需要一个。如何从一个转换为另一个? 问题答案: 好问题。我有以下五种 6种方法可以做到这一点。 注意:返回。因此有效地两者是相同的。 调用,这又设置了数组。 另一方面,调用以下程序包私有构造函数。 从源代码中的Java 8的源代码 因此似乎是最有效的方法,在这两个存储器和速度方面,用于转换char到String。

  • 问题内容: 我一直在尝试使用 GZIPOutputStream 等,但在理解它们方面没有成功。我要做的就是将字符串- “字符串” 转换为GZIP Base64格式。我怎样才能做到这一点? 编辑: 通过GZIP Base64格式,我的意思是字符串首先使用GZIP压缩,然后转换为Base64 问题答案: 使用Apache Commons Codec 。 这是一个示例类: 哪个输出: 在Linux下,您