首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用任意模式解析json,更新/创建一个字段并将其写回json(Scala)

如何使用任意模式解析json,更新/创建一个字段并将其写回json(Scala)
EN

Stack Overflow用户
提问于 2015-07-26 06:33:32
回答 1查看 352关注 0票数 1

如何使用任意模式在JSON对象中更新/创建字段,并将其写入Scala中的JSON?

我试过用类似于spray-json的方法:

代码语言:javascript
复制
import spray.json._
import DefaultJsonProtocol._
val jsonAst = """{"anyfield":"1234", "sought_optional_field":5.0}""".parse
val newValue = jsonAst.asJsObject.fields.getOrElse("sought_optional_field", 1)
val newMap = jsonAst.asJsObject.fields + ("sought_optional_field" -> newValue)
JSONObject(newMap).toJson

但是它给出了奇怪的结果:"{"anyfield"[ : "1234", "sought_optional_field" : ]1}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-26 07:28:20

你差点就到了:

代码语言:javascript
复制
import spray.json._
import DefaultJsonProtocol._

def changeField(json: String) = {
  val jsonAst = JsonParser(json)
  val map = jsonAst.asJsObject.fields
  val sought = map.getOrElse("sought_optional_field", 1.toJson)
  map.updated("sought_optional_field", sought).toJson
}

val jsonA = """{"anyfield":"1234", "sought_optional_field":5.0}"""
val jsonB = """{"anyfield":"1234"}"""

changeField(jsonA)
// spray.json.JsValue = {"anyfield":"1234","sought_optional_field":5.0}
changeField(jsonB)
// spray.json.JsValue = {"anyfield":"1234","sought_optional_field":1}

使用Argonaut:

代码语言:javascript
复制
import argonaut._, Argonaut._

def changeField2(json: String) =
  json.parseOption.map( parsed =>
    parsed.withObject(o => 
      o + ("sought_optional_field", o("sought_optional_field").getOrElse(jNumber(1)))
    )
  )

changeField2(jsonA).map(_.nospaces)
// Option[String] = Some({"anyfield":"1234","sought_optional_field":5})
changeField2(jsonB).map(_.nospaces)
// Option[String] = Some({"anyfield":"1234","sought_optional_field":1})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31634362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档