(Scala)更新json树中的叶子

时间:2016-11-11 18:46:16

标签: json scala

我有一个像下面这样的Json块:

{
    "filter": {
        "my_filter_123": {
            "type":       "synonym",
            "synonyms_path": "foxes_123.txt"
        },
        "my_filter_453": {
            "type":       "synonym",
            "synonyms_path": "foxes_456.txt"
        }
    },
    "analyzer": {
        "my_analyzer_abc": {
            "type":         "custom",
            "tokenizer":    "standard",
            "filter":       [ "lowercase",
                            "my_filter_123"]
        },
        "my_analyzer_def": {
            "type":         "custom",
            "tokenizer":    "standard",
            "filter":       [ "lowercase",
                            "my_filter_456"]
        }
    }
}

我对Scala和函数编程相当新,并且无法更新不可变对象...(我知道我无法更新它,而且我需要对其进行修改后的副本)

我正在尝试修改我不关心的叶子上指定的值,也不知道到达那里的确切路径。我一直在尝试使用带有更新的json转换函数,但似乎需要一个已知的路径,例如(__ \" filter" \" my_filter_123" \" synonyms_path&# 34)。我理想情况下喜欢使用递归路径,例如(__ \" synonyms_path"),但这似乎不起作用。

我想要的最终结果是将目录添加到如下所示的synonyms_path:

{
    "filter": {
        "my_filter_123": {
            "type":       "synonym",
            "synonyms_path": "synonyms_folder/foxes_123.txt"
        },
        "my_filter_453": {
            "type":       "synonym",
            "synonyms_path": "synonyms_folder/foxes_456.txt"
        }
    },
    "analyzer": {
        "my_analyzer_abc": {
            "type":         "custom",
            "tokenizer":    "standard",
            "filter":       [ "lowercase",
                            "my_filter_123"]
        },
        "my_analyzer_def": {
            "type":         "custom",
            "tokenizer":    "standard",
            "filter":       [ "lowercase",
                            "my_filter_456"]
        }
    }
}

我将非常感谢任何有关我应该查看的方向的指导。我好像是把头撞在墙上,我认为这真的不像我做的那么难。

提前致谢!

修改

我尝试的大部分内容都没有让我走得太远所以我删除了它,但这里有一个例子,我试图让更新功能只是添加一个字段到一个我不知道所有步骤的路径那里的路:

      val t = (__ \\ "synonyms_path").json.update(
        __.read[JsObject].map{ o => o ++ Json.obj( "newField" -> "test" ) }
      )

      val v = request.body.transform(t)

结果是: JsError(列表((// synonyms_path,列表(ValidationError(error.path.missing,WrappedArray())))))

0 个答案:

没有答案