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
相关产品推荐
相关产品推荐

