如何在Matlab中将变量转为Java Arrays.asList适配MongoDB Java驱动
解决Matlab数组适配MongoDB Java驱动的问题
这个问题我之前对接Matlab和MongoDB的时候也碰到过,核心是Matlab原生数值数组和Java包装类型数组的差异导致MongoDB的BSON编解码器无法识别,我来给你拆解下原因和解决办法:
问题根源
- 当你直接用字面量
{239.23042,-8328.20923}传给Arrays.asList时,Matlab会自动把这些数值包装成Java的Double对象,生成的列表是包含两个Double元素的java.util.Arrays$ArrayList,MongoDB的编解码器能正常处理这种包装类型的元素列表。 - 但Matlab的原生数值数组
apple = [239.23042,-8328.20923]对应的是Java的基本类型数组double[](类型标识为[D),当你调用Arrays.asList({apple})时,实际上是把整个double[]数组作为单个元素塞进了列表里——这就导致MongoDB看到的是一个数组对象而非数值列表,而它的编解码器没有注册double[]类型的处理逻辑,因此抛出CodecConfigurationException。
解决方法
方法1:手动转换为Java包装类型数组
把Matlab的原生double数组转换成Java的Double[]包装类型数组,再生成列表:
apple = [239.23042,-8328.20923]; % 创建对应长度的Java Double数组 javaDoubleArr = javaArray('java.lang.Double', length(apple)); % 逐个将Matlab数值包装为Java Double对象 for idx = 1:length(apple) javaDoubleArr(idx) = java.lang.Double(apple(idx)); end % 生成列表并写入MongoDB Doc = Document(); Doc.append('X', Arrays.asList(javaDoubleArr)); coll.insertOne(Doc);
方法2:利用Cell数组间接转换
Matlab的cell数组如果每个元素是数值,传给Arrays.asList时会自动转成Java的Double对象,注意要展开cell数组的元素而非直接传入整个cell:
apple = [239.23042,-8328.20923]; % 将Matlab数组转为cell数组 appleCell = num2cell(apple); % 展开cell元素传入Arrays.asList Doc = Document(); Doc.append('X', Arrays.asList(appleCell{:})); coll.insertOne(Doc);
方法3:用Matlab内置函数快速转换(R2020b+)
如果你的Matlab版本是R2020b及以后,可以用convertArray函数直接将Matlab数组转为符合要求的Java列表:
apple = [239.23042,-8328.20923]; % 直接转换为Java的Double列表 javaNumList = convertArray(apple, 'java.util.List<java.lang.Double>'); % 写入MongoDB Doc = Document(); Doc.append('X', javaNumList); coll.insertOne(Doc);
验证
转换后你可以用class()查看生成的列表元素类型,应该是java.lang.Double而非[D,此时MongoDB就能正常识别并序列化这个数值列表了。
内容的提问来源于stack exchange,提问作者ThatsRightJack
相关产品推荐
相关产品推荐

