Java查出的字符串如何返回成数组?

问题:

如图数据库存的varchar类型,r如何是返回的结果没有双引号?
控制器

@RequestMapping("/query")
    public List<HashMap<String, Object>> query() {
        return service.list();
    }

Service层

public List<HashMap<String, Object>> list() {
    sqlSession = MybatisUtil.getSqlSession();
    MyMapper mapper = sqlSession.getMapper(MyMapper.class);
    return mapper.getList();
}

Mapper

@Select("select * from tmp")
List<HashMap<String, Object>> getList();

1659081381687.png

更新解决办法:

image.png

@RequestMapping("/convertString")
    public List<HashMap<String, Object>> convertString() {
        String row =     "[[110.201664,20.011946],[110.26742,19.892085],[110.237594,19.747553],[110.209732,19.935714]]";

        HashMap<String, Object> map = new HashMap<>();
        List<HashMap<String, Object>> list = new ArrayList<>();
        map .put("stream", parse(row));

        Gson gson = new Gson();
        List res = gson.fromJson(row, List.class);
        map .put("gson", res);

        list.add(map);
        return list;
    }

    public static double[][] parse(String rowStr) {
        double[] items = Arrays.stream(rowStr.split("[\\[\\],\\s]+"))
                .filter(s -> !s.isEmpty())
                .mapToDouble(Double::parseDouble)
                .toArray();
        return IntStream.range(0, items.length / 2)
                .mapToObj(i -> new double[] { items[i + i], items[i + i + 1] })
                .toArray(double[][]::new);
    }
阅读 3k
4 个回答

库里存的应该就是一个字符串,使用数据库工具查看数据的时候是不需要加双引号显示的。但是取出来的若干行数据,转成 JSON 之后,str 中是保存的数据库取出来内容,也就是图左边看到的字符串。显然这个字符串本身也是 JSON 数据格式,所以这里有两种处理方法:

  • 在服务端依次对其进行 JSON 反序列化,得到 double[][],再序列化成 JSON 给前端
  • 直接返回给前端,由前端去反序列化

两种方式都行,关键是要跟前端协商好。当然如果后端需要使用坐标数据,那就必须在后端来处理了。

后端用 JSON 反序列化工具处理最简单。不过对于这种简单的格式,手工处理也未尝不可。不过每次写 Stream 的程序总是想吐槽 —— 真难用

package playground.sf.q1010000042241460;

import java.util.Arrays;
import java.util.stream.IntStream;

public class Solution {
    static final String row = "[[110.201664,20.011946],[110.26742,19.892085],[110.237594,19.747553],[110.209732,19.935714],[110.288754,19.99265],[110.170962,20.003081],[110.285858,20.010722],[110.285968,20.013942]]";

    public static double[][] parse(String rowStr) {
        var items = Arrays.stream(rowStr.split("[\\[\\],\\s]+"))
            .filter(s -> !s.isEmpty())
            .mapToDouble(Double::parseDouble)
            .toArray();
        return IntStream.range(0, items.length / 2)
            .mapToObj(i -> new double[] { items[i + i], items[i + i + 1] })
            .toArray(double[][]::new);
    }

    public static void main(String[] args) {
        var result = parse(row);
        System.out.println(Arrays.deepToString(result));
    }
}

如果拿 Kotlin 来写要轻松得多

package playground.sf.q1010000042241460

private const val row =
    "[[110.201664,20.011946],[110.26742,19.892085],[110.237594,19.747553],[110.209732,19.935714],[110.288754,19.99265],[110.170962,20.003081],[110.285858,20.010722],[110.285968,20.013942]]"

private fun parse(rowStr: String): Array<DoubleArray> {
    return rowStr.split("[\\[\\],\\s]+".toRegex())
        .filter { it.isNotEmpty() }
        .map { it.toDouble() }
        .chunked(2)
        .map { it -> it.toDoubleArray() }
        .toTypedArray();
}

fun main(args: Array<String>) {
    val result = parse(row)
    println(result.contentDeepToString())
}

使用split再Arrasy.toString

因为库里面存的就是一个字符串,你这样直接拿出来返回到前端,那肯定还是一个字符串。

猜测你是想把字符串转成json数组,这个数组里每一项又是一个数组,里面包含了两个字符串。那就在mapper.getList()之后,再遍历每一条记录,将str的值转换成List<List<String>>类型的列表,再返回给前端即可

在service层遍历一下,Map的value值从字符串转换成数据即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题