如何使用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
相关产品推荐
相关产品推荐

