首页 > 解决方案 > 创建字符串解析器来解析嵌套结构

问题描述

我正在寻找如何创建解析器来解析这样的字符串的信息:

[1,2,"abc",[2.2345,76,"n"],["abc",1,"c"],23,44]

用逗号分隔的方括号和方括号中的每个值(数字、小数、字符串、null)都可以嵌套在另一个方括号中,其中包含任意数量的值。

我需要用Java创建它。

问:是否有一些库、算法/设计策略/设计模式,如何创建这样的解析器?


编辑:

final String value = "[1,2,\"abc\",[2.2345,76,\"n\"],[\"abc\",1,\"c\"],23,44]";

ObjectMapper objectMapper = new ObjectMapper();
Object[] foo = objectMapper.readValue(value, Object[].class);

List<Object> tokens = Arrays.asList(foo);

它适用于单个值(不是嵌套数组),有没有办法在第一次调用中直接解析这些嵌套数组,还是我必须在tokensList 中找到这些数组并单独解析它?

标签: javaalgorithm

解决方案


嵌套的 JSON 数组被解析为List对象。由于您似乎也希望外部 JSON 数组为 a List,因此将其解析为该数组,而不是解析为Object[].

您可以看到使用此代码实际得到的结果:

public static void main(String[] args) throws Exception {
    final String value = "[1,2,\"abc\",[2.2345,76,\"n\"],[\"abc\",1,\"c\"],23,44]";

    ObjectMapper objectMapper = new ObjectMapper();
    List<?> tokens = objectMapper.readValue(value, List.class);

    printTypes("", tokens);
}
static void printTypes(String indent, List<?> tokens) {
    for (Object token : tokens) {
        System.out.println(indent + token.getClass().getName() + " - " + token);
        if (token instanceof List)
            printTypes(indent + "  ", (List<?>) token);
    }
}

输出

java.lang.Integer - 1
java.lang.Integer - 2
java.lang.String - abc
java.util.ArrayList - [2.2345, 76, n]
  java.lang.Double - 2.2345
  java.lang.Integer - 76
  java.lang.String - n
java.util.ArrayList - [abc, 1, c]
  java.lang.String - abc
  java.lang.Integer - 1
  java.lang.String - c
java.lang.Integer - 23
java.lang.Integer - 44

推荐阅读