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

如何使用Java在二维码中添加多条数据?附现有生成代码

在Java二维码中添加多条数据的解决方案

要在二维码中存储多条数据,核心思路是把零散的多字段数据先整合成一个结构化的字符串(比如用自定义分隔符分隔、JSON格式或XML格式),然后将这个整合后的字符串编码为二维码;后续解码时,再把字符串拆分回原来的多字段数据。

结合你给出的代码片段,我用ZXing库(你代码里已经用到了它的相关类)来实现完整的可运行示例:

步骤1:准备依赖(Maven项目)

如果是Maven项目,先添加ZXing的核心和JavaSE依赖:

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.3</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.5.3</version>
</dependency>

步骤2:完整生成二维码代码

下面的代码会把你的name、occu、dob三个字段整合成结构化字符串,然后生成二维码:

import com.google.zxing.*;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

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

public class GenQR {
    private String name;
    private String occu;
    private String dob;

    GenQR() {
        this.name = "Syeda Tabassum";
        this.occu = "Student";
        this.dob = "20-may-1997";
    }

    // 把多字段整合成一个字符串(提供两种方式可选)
    private String getCombinedData() {
        // 方式1:用自定义分隔符(注意选不会在数据中出现的字符,比如|)
        return name + "|" + occu + "|" + dob;
        
        // 方式2:用JSON格式(更规范,适合复杂数据结构)
        // return "{\"name\":\"" + name + "\",\"occupation\":\"" + occu + "\",\"dob\":\"" + dob + "\"}";
    }

    public void generateQRCode(String filePath) throws WriterException, IOException {
        String combinedData = getCombinedData();
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        
        // 设置二维码纠错等级等参数
        Map<EncodeHintType, ErrorCorrectionLevel> hintMap = new HashMap<>();
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        
        // 生成二维码矩阵
        BitMatrix bitMatrix = qrCodeWriter.encode(
                combinedData,
                BarcodeFormat.QR_CODE,
                300, 300, // 二维码宽高尺寸
                hintMap
        );
        
        // 将矩阵写入本地图片文件
        MatrixToImageWriter.writeToPath(
                bitMatrix,
                "jpg",
                new File(filePath).toPath()
        );
        System.out.println("二维码已成功生成到路径:" + filePath);
    }

    public static void main(String[] args) {
        GenQR obj = new GenQR();
        String filePath = "H:\\QRdata\\data.jpg";
        try {
            obj.generateQRCode(filePath);
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }
    }
}

步骤3:解码并拆分多字段数据

如果要读取二维码并还原回原来的多字段数据,示例代码如下:

import com.google.zxing.BinaryBitmap;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

public class ReadQR {
    public static String readQRCode(String filePath) throws IOException, NotFoundException {
        BinaryBitmap binaryBitmap = new BinaryBitmap(
                new HybridBinarizer(
                        new BufferedImageLuminanceSource(
                                ImageIO.read(new File(filePath))
                        )
                )
        );
        
        Result result = new MultiFormatReader().decode(binaryBitmap);
        return result.getText();
    }

    public static void main(String[] args) {
        String filePath = "H:\\QRdata\\data.jpg";
        try {
            String qrContent = readQRCode(filePath);
            System.out.println("读取到的二维码内容:" + qrContent);
            
            // 和生成时的格式对应,拆分数据
            String[] dataParts = qrContent.split("\\|");
            if (dataParts.length == 3) {
                System.out.println("姓名:" + dataParts[0]);
                System.out.println("职业:" + dataParts[1]);
                System.out.println("出生日期:" + dataParts[2]);
            }
            
            // 如果用了JSON格式,推荐用Jackson/Gson等库解析
            // ObjectMapper mapper = new ObjectMapper();
            // UserData userData = mapper.readValue(qrContent, UserData.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 对应JSON格式的实体类(按需使用)
    static class UserData {
        private String name;
        private String occupation;
        private String dob;
        
        // getter和setter方法省略
    }
}

关键注意事项

  • 分隔符选择:如果用自定义分隔符,一定要选不会出现在你的业务数据中的字符(比如|、###这类),避免拆分时出错。
  • JSON格式更可靠:如果数据字段较多或者结构复杂,优先用JSON序列化/反序列化,可读性和容错性更强。
  • 二维码容量限制:普通QR码最多可存储约2500个字符,只要你的整合后数据不超过这个范围就没问题。

内容的提问来源于stack exchange,提问作者S.tab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:32:51