当前位置: 首页 > 面试题库 >

Java中json文档中叶节点的所有路径的输出列表

束研
2023-03-14
问题内容

例如:给定此json文档:

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

我想产生(类似)此输出:

store.book.category: "reference"
store.book.author: "Nigel Rees"
store.book.title: "Sayings of the Century"
store.book.price: 8.95
store.book.category: "fiction"
store.book.author: "Herman Melville"
store.book.title: "Moby Dick"
store.book.isbn: "0-553-21311-3"
store.book.price: 8.99
store.bicycle.color: "red"
store.bicycle.price: 19.95
expensive:10

与其使用原始文本,不如使用基于健壮的json库(gson,jackson等)之一的高效解决方案。


问题答案:

事实证明,使用Gson做到这一点非常容易,尤其是使用2.3中引入的JsonReader.getPath()方法时。

static void parseJson(String json) throws IOException {

    JsonReader reader = new JsonReader(new StringReader(json));
    reader.setLenient(true);
    while (true) {
        JsonToken token = reader.peek();
        switch (token) {
            case BEGIN_ARRAY:
                reader.beginArray();
                break;
            case END_ARRAY:
                reader.endArray();
                break;
            case BEGIN_OBJECT:
                reader.beginObject();
                break;
            case END_OBJECT:
                reader.endObject();
                break;
            case NAME:
                reader.nextName();
                break;
            case STRING:
                String s = reader.nextString();
                print(reader.getPath(), quote(s));
                break;
            case NUMBER:
                String n = reader.nextString();
                print(reader.getPath(), n);
                break;
            case BOOLEAN:
                boolean b = reader.nextBoolean();
                print(reader.getPath(), b);
                break;
            case NULL:
                reader.nextNull();
                break;
            case END_DOCUMENT:
                return;
        }
    }
}

static private void print(String path, Object value) {
    path = path.substring(2);
    path = PATTERN.matcher(path).replaceAll("");
    System.out.println(path + ": " + value);
}

static private String quote(String s) {
    return new StringBuilder()
            .append('"')
            .append(s)
            .append('"')
            .toString();
}

static final String REGEX = "\\[[0-9]+\\]";
static final Pattern PATTERN = Pattern.compile(REGEX);


 类似资料:
  • 我有一棵看起来像上面的树,由一个链接结构表示: 我的目标是找到从根节点到叶节点的所有路径。 我的树遍历算法如下所示: 当我运行它时,我确信树正在按图所示构建。我已经测试过了。然而,我无法找出我的树遍历分割错误的原因。 我得到的输出是: 我已经在高度较小的树上测试了它,它是有效的。但是出于某种原因,它不适用于高度大于2的树。我认为这是树出了问题,我检查并打印了每个父级、左子级和右子级,它们打印出来如

  • 本文向大家介绍php获取json数据所有的节点路径,包括了php获取json数据所有的节点路径的使用技巧和注意事项,需要的朋友参考一下 之前我们讲解过使用javascript获取json数据节点路径的问题,今天我们更进一步,讲解下php获取json数据所有的节点路径 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 本文向大家介绍访问C ++中所有节点的最短路径,包括了访问C ++中所有节点的最短路径的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个带有N个节点的无向连通图,这些节点被标记为0、1、2,...,N-1。图的长度将为N,并且仅当节点i和j连接时,j才与列表graph [i]中的i不完全相同。我们必须找到访问每个节点的最短路径的长度。我们可以在任何节点处开始和停止,可以多次访问节点,并且可以

  • 本文向大家介绍Elixir列出系统中所有可见的节点,包括了Elixir列出系统中所有可见的节点的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我试图解决一个问题,其中有一个带正加权边的无向图,我需要找到一个最短的路径,该路径正好覆盖所有节点,一旦给定了起始节点和结束节点。此外,图是完整的(每个节点都连接到图中的所有其他节点)。我已经试着寻找一个算法可以解决这个问题,但我还没有找到一个解决这个问题。由于起止节点的限制,这并不完全是旅游销售员的问题。我将感谢任何帮助。

  • 我有一个加权和无向图,有顶点。其中两个顶点是和。 我需要找到最短的路径,从开始,在结束,并通过G的所有顶点(以任何顺序)。 如何做到这一点? 这不是旅行推销员问题:我不需要访问每个顶点一次,也不想回到第一个顶点。