Scala:从具有定义名称的嵌套对象中的json文件中删除字段 [英] Scala: remove field from json files in the nested object with defined name

查看:296
本文介绍了Scala:从具有定义名称的嵌套对象中的json文件中删除字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是scala的新手.我正在尝试对json文件进行简单的操作.我被困在以下任务:如何在定义名称的对象内难以删除定义名称的字段. 例如,我想从对象名称2中删除dsc1字段

I'm new to scala. I'm trying to make simple manipulations with json files. I'm stucked with the following task: how can I ellegant remove field with defined name within object with defined name. As an example I'd like to delete dsc1 field from the object name2

{
  "group": {
    "name1":{
      "dsc":"some dsc",
      "dsc1":"some dsc",
      "dsc2":"some dsc"
     },
    "name2":{
      "dsc":"some dsc",
      "dsc1":"some dsc",
      "dsc2":"some dsc"
    }
  }
}

为了解析,我使用了liftweb. 我已经创建了以下代码,但是它删除了所有的dsc1:

For parsing I'm using liftweb. I've cteate the following code but it deletes all dsc1:

val transformedJson2 = parsedInput transform { 
    case JObject(fields) if (fields.head.name == "name2") => JObject(fields) transform {
          case JField("dsc1", JArray(xs)) =>  JNothing
}

推荐答案

我稍微重写了您的转换,当我尝试对您的输入进行尝试时,这似乎奏效了:

I rewrote your transformation a little bit, and this seemed to worked when I tried it against your input:

val transformedJson2 = parsedInput transform { 
  case JField("name2", fields) => 
    fields remove {
      case JField("dsc1", _) =>  true
      case _ => false   
    }
}

除了使用remove之外,您还可以像在示例中一样使用第二个transform:

Instead of using remove, you could also use a second transform as you did in your example:

val transformedJson2 = parsedInput transform { 
  case JField("name2", fields) => 
    fields transform {
      case JField("dsc1", _) =>  JNothing
    }
}

因此,通过使用来自以下位置的解析输入:

So, by using the parsed input from:

scala> val parsedInput = parse(""" {
     |   "group": {
     |     "name1":{
     |       "dsc":"some dsc",
     |       "dsc1":"some dsc",
     |       "dsc2":"some dsc"
     |      },
     |     "name2":{
     |       "dsc":"some dsc",
     |       "dsc1":"some dsc",
     |       "dsc2":"some dsc"
     |     }
     |   }
     | } """)
parsedInput: net.liftweb.json.package.JValue = JObject(List(JField(group,JObject(List(JField(name1,JObject(List(JField(dsc,JString(some dsc)), JField(dsc1,JString(some dsc)), JField(dsc2,JString(some dsc))))), JField(name2,JObject(List(JField(dsc,JString(some dsc)), JField(dsc1,JString(some dsc)), JField(dsc2,JString(some dsc))))))))))

两者都应产生输出:

scala> pretty(render(transformedJson2))
res10: String = 
{
  "group":{
    "name1":{
      "dsc":"some dsc",
      "dsc1":"some dsc",
      "dsc2":"some dsc"
    },
    "name2":{
      "dsc":"some dsc",
      "dsc2":"some dsc"
    }
  }
}

这篇关于Scala:从具有定义名称的嵌套对象中的json文件中删除字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆