反序列化JSON字典

时间:2018-10-10 18:45:31

标签: json scala spray-json

这里令人头疼,我如何像图像中那样反序列化JSON?我通常会看到类似{“ Word”:“ Fish”,“ Definition”:“ It is a animal”等}之类的东西,但是我发现与我所寻找的东西最接近的东西并没有指定值类型,因此我无法使用案例类真正反序列化它。很抱歉我真的希望有一个清晰的解释,我对此很不好。

我真的很期待一个答案,谢谢您的阅读。

enter image description here

1 个答案:

答案 0 :(得分:-1)

您似乎正在尝试解析psuedo json格式的实际字典,但看起来更像是用括号括起来的键值对。如果要解决这样的问题,我将使用基本的字符串解析。要正确反序列化JSON,JSON必须有效,并且您必须能够将JSON表示为case类。图片中的文本不能表示为case类,因为没有一个元素出现多次。

这是我如何在Scala中解决此问题的有效示例。

    scala> val test = "{\"dog\":\"animal with four legs\",\"fish\":\"underwater animal\",\"horse\":\"tall running animal\"}"
//test: String = {"dog":"animal with four legs","fish":"underwater animal","horse":"tall running animal"}

scala> val test2 = test.replace("{","").replace("}","").replace("\"","")
//test2: String = dog:animal with four legs,fish:underwater animal,horse:tall running animal

scala> val test3 = test2.split(",")
//test3: Array[String] = Array(dog:animal with four legs, fish:underwater animal, horse:tall running animal)

scala> val test4 = test3.map(innerValue => innerValue.split(":"))
//test4: Array[Array[String]] = Array(Array(dog, animal with four legs), Array(fish, underwater animal), Array(horse, tall running animal))

scala> val test5 = test4.map( outerArray => outerArray(0) -> outerArray(1)).toMap
//test5: scala.collection.immutable.Map[String,String] = Map(dog -> animal with four legs, fish -> underwater animal, horse -> tall running animal)

scala> test5("dog")
//res1: String = animal with four legs

步骤:

测试:将字符串定义为变量

Test2:使用链接数次的替换功能删除不需要的文本

Test3:根据逗号将字符串分成几个数组

Test4:遍历数组并在:上拆分较小的字符串:

Test5:遍历数组数组并创建键值对,然后转换为映射。

Test5现在是图片中显示的文档类型的scala映射表示形式,您可以基于键访问值。

虽然这将起作用,但对于大型文档而言会比较慢,最好将其表示为可以使用标准方法进行序列化和反序列化的正确定义的JSON文档。格式正确的json文档可能看起来像这样。

{
"dictionary_entries": [
    {
        "term": "dog",
        "description": "animal with four legs"
    },
    {
        "term": "fish",
        "description": "underwater animal"
    },
    {
        "term": "horse",
        "description": "tall running animal"
    }
]
}