如何使用 jackson 将 Java 类转换为 Map 并将非字符串成员转换为 json?

2024-02-01

我有一些 Java 类,我想将其转换为Map<String, String>。问题是我的 java 类的任何字段没有明显的String表示形式(集合、其他类)应转换为 json 字符串。

这是一个例子:

@Data
@AllArgsConstructor
class MyClass {
    String field1;
    Long field2;
    Set<String> field3;
    OtherClass field4;
}

@Data
@AllArgsConstructor
class OtherClass {
    String field1;
    String field2;
}

ObjectMapper mapper = new ObjectMapper();
MyClass myClass = new MyClass("value", 
                              123L, 
                              Sets.newHashSet("item1", "item2"),
                              new OtherClass("value1", "value2"));
Map<String, String> converted =
        mapper.convertValue(myClass, new TypeReference<Map<String, String>>(){});

在此刻,converted应如下所示:

"field1" -> "value"
"field2" -> "123"
"field3" -> "[\"item1\", \"item2\"]"
"field4" -> "{\"field1\":\"value1\",\"field2\":\"value2\"}"

相反,调用mapper.convertValue尝试反序列化 Set 时失败,但有异常java.lang.IllegalArgumentException: Can not deserialize instance of java.lang.String out of START_ARRAY token.

有什么特殊的配置我可以注释一下MyClass用或方法来配置ObjectMapper使这个工作按照我想要的方式进行?


这是一种方法。

private static final ObjectMapper mapper = new ObjectMapper();

public Map<String, String> toMap(Object obj) {
    // Convert the object to an intermediate form (map of strings to JSON nodes)
    Map<String, JsonNode> intermediateMap = mapper.convertValue(obj, new TypeReference<Map<String, JsonNode>>() {});

    // Convert the json nodes to strings
    Map<String, String> finalMap = new HashMap<>(intermediateMap.size() + 1); // Start out big enough to prevent resizing
    for (Map.Entry<String, JsonNode> e : intermediateMap.entrySet()) {
        String key = e.getKey();
        JsonNode val = e.getValue();

        // Get the text value of textual nodes, and convert non-textual nodes to JSON strings
        String stringVal = val.isTextual() ? val.textValue() : val.toString();

        finalMap.put(key, stringVal);
    }

    return finalMap;
}

如果你想将 Map 转换回原始类......

public static <T> T fromMap(Map<String, String> map, Class<T> clazz) throws IOException {
    // Convert the data to a map of strings to JSON nodes
    Map<String, JsonNode> intermediateMap = new HashMap<>(map.size() + 1); // Start out big enough to prevent resizing
    for (Map.Entry<String, String> e : map.entrySet()) {
        String key = e.getKey();
        String val = e.getValue();

        // Convert the value to the right type of JsonNode
        JsonNode jsonVal;
        if (val.startsWith("{") || val.startsWith("[") || "null".equals(val)) {
            jsonVal = mapper.readValue(val, JsonNode.class);
        } else {
            jsonVal = mapper.convertValue(val, JsonNode.class);
        }

        intermediateMap.put(key, jsonVal);
    }

    // Convert the intermediate map to an object
    T result = mapper.convertValue(intermediateMap, clazz);

    return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 jackson 将 Java 类转换为 Map 并将非字符串成员转换为 json? 的相关文章

  • 通过 html tidy 提供渲染 jsp 页面

    我有一个在 Glassfish 上运行的 Java 项目 它会呈现一些难看的 HTML 这是使用各种内部和外部 JSP 库的副作用 我想设置某种渲染后过滤器 通过 HTMLTidy 提供最终的 HTML 这样源代码就很好且整洁 有助于调试
  • Java 流 - 按嵌套列表分组(按第二顺序列出)

    我有以下数据结构 每个学生都有一个州列表 每个州都有一个城市列表 public class Student private int id private String name private List
  • Java“空白最终字段可能尚未初始化”方法中抛出异常

    我有一些代码 例如 final int var1 if isSomethingTrue var1 123 else throwErrorMethod int var2 var1 throwErrorMethod 的定义如下 private
  • 如何将抽象工厂与单例模式结合起来? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 java 编码 并且对这些模式很陌生 谁能给我一个也使用单例的工厂抽象的例子 这是一个实现类的示例单例模式 这个实现也是线程安全
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • 如何在 Java 中使用 StringUtils?

    我是 Java 初学者 我想用StringUtils replace但 Eclipse 输出 StringUtils cannot be resolved I tried import java lang 但它不起作用 java lang不
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • 按文件名过滤 eclipse 中的警告

    我们使用 Eclipse 进行 Java 开发 并使用 Maven 将 JSP 编译成 servlet 以便在嵌入式 Jetty 实例中使用 这意味着要从 Eclipse 运行该项目 我必须包含 target jsp source 作为源文
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • 如何在 Laravel 5 中处理嵌套的 JSON 对象请求?

    我们在 Laravel 5 和 AngularJs Ionic 中运行此 Web 服务来处理 Web 当我们将请求从 Web 客户端 发送到 Web 服务 后端 时 我们传递了嵌套的 JSON 对象 我们在读取服务器端父对象下的所有子对象时
  • spring mvc 跟踪引用页面

    在基于注释的弹簧控制器中 如果用户正在url com first page并点击一个链接或提交一份表格指出url com second page 如何制作second page知道url of first page所以这样second pa
  • Java 中的 MP4 容器编写器

    我想找到一个免费的 Java MP4 容器 编写器 我不需要编码器 只需要能够根据预期值写入正确原子的编码器 Bonus对于这样一个库 也可以编写 有效 F4V 我更喜欢纯 Java 解决方案 而不是使用 JNI 或外部可执行文件的解决方案
  • 反应式 Spring Webflux REST 控制器内部重定向

    我正在为 spring 反应项目创建简单的控制器服务器 在设置重定向到另一个位置时 我在调用时发现错误http localhost 8080 There was an unexpected error type Internal Serve
  • java中日期转换dd-MMM-yyyy到dd-MM-yyyy

    在Java中将23 Mar 2011转换为23 03 2011的最简单方法是什么 感谢大家 这似乎解决了这个问题 try Calendar cal Calendar getInstance cal setTime new SimpleDat
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • while 之后无法访问的语句[重复]

    这个问题在这里已经有答案了 我只是修改代码 在以下代码中出现错误 int x 1 System out println x x while true x System out println x x 错误在最后一行 我可以知道错误 错误 无
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • 在没有EOF的情况下停止读取java中的输入

    In 问题 如何停止读取输入 我的程序继续运行 要求更多输入 public static void main String args throws Exception BufferedReader br new BufferedReader

随机推荐