如何在json中指定特定的对象路径

时间:2016-10-09 13:30:31

标签: java json scala json4s

我使用json4s将json解析为我的scala case类对象,第一个工作得很好:

case class Person(Id: String, name: String)

val personJSON = """[ {"Id": "1","name": "john"},
                      {"Id": "2","name": "george"},
                      {"Id": "3","name": "tom"},
                      {"Id": "4","name": "tammy"},
                      {"Id": "5","name": "melanie"}  ]""".stripMargin

val listOfPersonAsObjects = JsonMethods.parse(personJSON).extract[List[Person]]

工作完美,没问题。

但现在json是一个内部有对象的人:

case class Animal(name: String, age: String)

val animalsJSON = """{ "animals":[ {"name": "giraffe","age": "12"},
                       {"name": "lion","age": "4"},
                       {"name": "snake","age": "5"},
                       {"name": "tiger","age": "3"},
                       {"name": "elephant","age": "7"}] }""".stripMargin

所以现在我需要解析json中的“animals:”对象......

我的想法是这样的:

val listOfAnimalsAsObjects = JsonMethods.parse(animalsJSON[0]).extract[List[Animal]]

但它不起作用......我如何指定我想在json中使用“animals:”对象?

我无法改变json,它究竟是如何实现它的

谢谢!

2 个答案:

答案 0 :(得分:0)

不适合您的JSON不是列表。它是一个包含列表的对象。因此,您的对象需要匹配该结构。

这样的事情:

class AnimalListContainer
{
    List<Animal> Animals;
    public AnimalListContainer()
    {
        Animals = new ArrayList<>();
    }
}

然后当你尝试解析时:

val animalListContainer = JsonMethods.parse(animalsJSON[0]).extract[AnimalListContainer]

(未经测试的代码 - 对于任何语法错误感到抱歉)。

答案 1 :(得分:0)

有几个库可用于解析JSON路径。我使用了一个名为OGNL的Apache库。这不是最好的,也不是最有效的。它不再被积极开发,但它完成了这项工作。它远比你需要做的更强大,但是对于你需要的东西,它非常简单。您可以轻松下载并将其集成到您的项目中。