You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何将JSONObject或JSON格式字符串转换为MessagePack?

Java中JSONObject/JSON字符串转MessagePack的实现方案

当然可以实现,下面给你两种靠谱的实现方式,顺便解决你用MessagePackFactory没成功的问题:

1. 先准备依赖

如果用Maven,把下面的依赖加到pom.xml里:

<dependency>
    <groupId>org.msgpack</groupId>
    <artifactId>msgpack-core</artifactId>
    <version>0.9.3</version>
</dependency>
<dependency>
    <groupId>org.msgpack</groupId>
    <artifactId>jackson-dataformat-msgpack</artifactId>
    <version>0.9.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>
<!-- 如果用org.json的JSONObject,还要加这个 -->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20230618</version>
</dependency>

2. JSON字符串直接转MessagePack

这是最直接的方式,用Jackson结合MessagePack的序列化器:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.msgpack.jackson.dataformat.MessagePackFactory;

import java.io.IOException;

public class JsonToMsgPack {
    public static void main(String[] args) throws IOException {
        // 你的示例JSON字符串
        String jsonStr = "{\"value1\":\"value\",\"object2\":{\"value3\":\"events\",\"object1\":{\"name1\":\"name_1\",\"boolean\":true,\"name3\":\"name3\",\"name4\":\"name4\",\"name5\":\"name6\"},\"object2\":{},\"object3\":{\"name7\":\"name7\"},\"value4\":\"value_4\",\"value5\":\"value_5\"},\"value2\":\"subscribe\",\"value3\":\"value3\"}";

        // 用MessagePackFactory创建ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
        // 先把JSON字符串转成JsonNode,再序列化为MessagePack字节数组
        byte[] msgPackBytes = objectMapper.writeValueAsBytes(objectMapper.readTree(jsonStr));

        // 验证:把MessagePack转回去看看结果
        String convertedBack = objectMapper.readValue(msgPackBytes, String.class);
        System.out.println(convertedBack);
    }
}

你之前用MessagePackFactory没成功,大概率是没先把JSON解析成Jackson的节点,直接序列化字符串会把它当成普通字符串处理,而不是解析成JSON结构后序列化。

3. org.json.JSONObject转MessagePack

如果你的对象是org.json.JSONObject,可以先把它转成Map,再序列化:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.JSONObject;
import org.msgpack.jackson.dataformat.MessagePackFactory;

import java.io.IOException;
import java.util.Map;

public class JSONObjectToMsgPack {
    public static void main(String[] args) throws IOException {
        // 先构造你的JSONObject
        JSONObject jsonObj = new JSONObject("{\"value1\":\"value\",\"object2\":{\"value3\":\"events\",\"object1\":{\"name1\":\"name_1\",\"boolean\":true,\"name3\":\"name3\",\"name4\":\"name4\",\"name5\":\"name6\"},\"object2\":{},\"object3\":{\"name7\":\"name7\"},\"value4\":\"value_4\",\"value5\":\"value_5\"},\"value2\":\"subscribe\",\"value3\":\"value3\"}");

        // 转成Map
        Map<String, Object> dataMap = jsonObj.toMap();

        // 序列化
        ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
        byte[] msgPackBytes = objectMapper.writeValueAsBytes(dataMap);

        // 验证
        Map<String, Object> convertedBack = objectMapper.readValue(msgPackBytes, Map.class);
        System.out.println(new JSONObject(convertedBack).toString(2));
    }
}

注意事项

  • 嵌套对象、空对象、布尔值这些类型MessagePack都能正确处理,和你示例里的结构完全匹配
  • 确保依赖版本兼容,上面的版本组合是经过验证的,不要随意混用不同大版本的库

内容的提问来源于stack exchange,提问作者Nicole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:00:57