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

如何将PLC字节流转换为JSON或Java对象?求支持的反序列化框架

当然有不少框架能搞定这类结构化字节流的反序列化需求,结合你给出的PLC数据结构场景,我给你推荐几个实用的方案:

推荐框架及实现思路

1. Jackson(搭配自定义反序列化器)

Jackson是Java生态里处理JSON最常用的库,虽然它默认聚焦JSON处理,但你可以通过自定义反序列化器来解析字节流,再转成JSON或Java对象,完美适配你的需求。

核心步骤:

  • 先定义对应的数据类:
public class Data {
    private int id;
    private int[] pos;
    private int time; // PLC的dint对应Java的int(32位有符号整数)

    // 构造器、getter、setter省略
}
  • 编写自定义JsonDeserializer,利用ByteBuffer按约定顺序解析字节:
    从字节流里依次读取2字节的id、4个2字节的pos元素、4字节的time,组装成Data对象后,Jackson就能直接把它序列化成你要的JSON格式。

2. Netty ByteBuf + 自定义编解码器

如果你的场景是和PLC直接做网络通信,Netty的ByteBuf工具类对字节流的处理非常高效。你可以自定义一个解码器,按照PLC的数据结构约定解析字节,转换成Java对象后再转JSON。

解码器核心示例:

public class DataDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 先判断字节数是否足够:2(id) + 4*2(pos) + 4(time) = 14字节
        if (in.readableBytes() < 14) {
            return;
        }
        int id = in.readShort(); // 对应示例里的2字节int
        int[] pos = new int[4];
        for (int i = 0; i < 4; i++) {
            pos[i] = in.readShort();
        }
        int time = in.readInt(); // 对应PLC的dint类型
        Data data = new Data(id, pos, time);
        out.add(data);
        
        // 转成目标JSON
        String json = new ObjectMapper().writeValueAsString(data);
        System.out.println(json);
    }
}

3. 专门的PLC通信框架

如果是直接和PLC交互,还有一些针对性的框架能帮你省掉手动解析字节的麻烦:

  • S7-JLib:针对西门子PLC,可直接读取DB块数据,按照你定义的Data结构自动映射成Java对象
  • EtherNet/IP Java库:适配罗克韦尔等支持EtherNet/IP协议的PLC,同样支持结构化数据映射

这类框架已经封装了PLC的字节协议细节,拿到Java对象后转JSON就是一行代码的事。

4. 手动解析(ByteBuffer)

如果数据结构固定且场景简单,直接用JDK自带的ByteBuffer手动解析也很灵活,不需要额外依赖:

byte[] bytes = {0,5,0,1,0,2,0,3,0,4,0,0,0,5};
ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN); // 示例是大端字节序

int id = buffer.getShort();
int[] pos = new int[4];
for (int i = 0; i < 4; i++) {
    pos[i] = buffer.getShort();
}
int time = buffer.getInt();

Data data = new Data(id, pos, time);
// 转JSON
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(data);
// 输出结果:{"id":5,"pos":[1,2,3,4],"time":5}
总结

如果只是单纯处理字节流转对象/JSON,Jackson自定义反序列化或ByteBuffer手动解析就足够;如果是和PLC通信,专门的PLC框架会更省心,能帮你规避协议细节的坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:42:27