【问题标题】:Is this a bug in the Jackson JsonParser, or am I doing something wrong?这是 Jackson JsonParser 中的错误,还是我做错了什么?
【发布时间】:2019-10-30 20:15:17
【问题描述】:

我正在观察 Jackson JsonParser 的一些奇怪行为,特别是在数组中捕获正确的 JsonPointer

给定以下 JSON sn-p:

[
    {
        "name": "a",
        "children": [
            {
                "name": "b"
            },
            {
                "name": "c"
            },
            {
                "name": "d"
            }
        ]
    },
    {
        "name": "e",
        "children": [
            {
                "name": "f"
            },
            {
                "name": "g",
                "children": [
                    {
                        "name": "h"
                    },
                    {
                        "name": "i"
                    }
                ]
            }
        ]
    },
    {
        "name": "j"
    }
]

我有一个简单的 Kotlin 函数,它尝试迭代 nextToken(),如下所示:

fun main()
{
    val jsonParser = jacksonObjectMapper().readTree(JSON).traverse()

    while (jsonParser.nextToken() != null)
    {
        val jsonPointer = jsonParser.parsingContext?.pathAsPointer(true) ?: continue
        val tokenName = jsonParser.currentToken.name
        println("${jsonPointer.toString().padEnd(40)} $tokenName")
    }
}

现在,这里有什么奇怪的; jsonPointer 不区分数组索引,如输出所示:

                                         START_ARRAY
                                         START_OBJECT
/0/name                                  FIELD_NAME
/0/name                                  VALUE_STRING
/0/children                              FIELD_NAME
/0/children                              START_ARRAY
/0/children                              START_OBJECT
/0/children/0/name                       FIELD_NAME
/0/children/0/name                       VALUE_STRING
/0/children                              END_OBJECT
/0/children                              START_OBJECT
/0/children/0/name                       FIELD_NAME
/0/children/0/name                       VALUE_STRING
/0/children                              END_OBJECT
/0/children                              START_OBJECT
/0/children/0/name                       FIELD_NAME
/0/children/0/name                       VALUE_STRING
/0/children                              END_OBJECT
/0/children                              END_ARRAY
                                         END_OBJECT
                                         START_OBJECT
/0/name                                  FIELD_NAME
/0/name                                  VALUE_STRING
/0/children                              FIELD_NAME
/0/children                              START_ARRAY
/0/children                              START_OBJECT
/0/children/0/name                       FIELD_NAME
/0/children/0/name                       VALUE_STRING
/0/children                              END_OBJECT
/0/children                              START_OBJECT
/0/children/0/name                       FIELD_NAME
/0/children/0/name                       VALUE_STRING
/0/children/0/children                   FIELD_NAME
/0/children/0/children                   START_ARRAY
/0/children/0/children                   START_OBJECT
/0/children/0/children/0/name            FIELD_NAME
/0/children/0/children/0/name            VALUE_STRING
/0/children/0/children                   END_OBJECT
/0/children/0/children                   START_OBJECT
/0/children/0/children/0/name            FIELD_NAME
/0/children/0/children/0/name            VALUE_STRING
/0/children/0/children                   END_OBJECT
/0/children/0/children                   END_ARRAY
/0/children                              END_OBJECT
/0/children                              END_ARRAY
                                         END_OBJECT
                                         START_OBJECT
/0/name                                  FIELD_NAME
/0/name                                  VALUE_STRING
                                         END_OBJECT

路径总是返回 0 的索引,无论是在第一个还是第 n 个元素中。

这是一个错误吗?还是我设法介绍了一个?

【问题讨论】:

  • 我不知道你的问题的答案。但是理解代码有点困难。我认为最好将 lambda 提取到一个新函数并使用简单的 if (jsonPointer != null) 块或类似 jsonPointer?let {} 的东西而不是 when。我
  • 很公平,我会把它折叠成更简单的东西。

标签: java json kotlin jackson jsonpointer


【解决方案1】:

您可能遇到了这个问题:

https://github.com/FasterXML/jackson-databind/issues/2525

这特别影响“阅读”JsonNode 内容的情况。 2.11 的处理是固定的(将于 2019 年底或 2020 年初发布),但尚未为 2.10 打补丁。

【讨论】:

  • 很棒的发现,谢谢 — 我在哪里可以找到 FasterXML 包的快照版本? (我对 Java 场景还是比较陌生)
  • Sonatype OSS repo, pom.xml for Jackson 包包括它:https://oss.sonatype.org/content/repositories/snapshots
  • 谢谢!我将创建一个孤立的案例并报告:-)
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
相关资源
最近更新 更多