如何编写扩展方法以null从 ArgonautJson对象中删除所有具有值的键:
我试过这个:
package object Extensions {
implicit class JsonExtensions(val json: Json) extends AnyVal {
def removeNulls: Json = {
json.withObject(j => JsonObject.from (j.toMap.filter(!_._2.isNull).toList))
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它似乎只是null在Json对象的顶层删除具有值的键......
我有一个案例类和伴侣对象:
case class Person private(name: String, age: Int)
object Person {
def validAge(age: Int) = {
if (age > 18) age.successNel else "Age is under 18".failureNel
}
def validName(name: String) = {
name.successNel
}
def create(name: String, age: Int) = (validAge(age) |@| validName(name))(Person.apply)
}
Run Code Online (Sandbox Code Playgroud)
我想使用Argonaut解析一些JSON并返回一个Person或一些错误,作为一个列表.所以我需要:
我希望以某种形式返回错误,我可以将其变成更多JSON,如:
{
errors: ["Error1", "Error2"]
}
Run Code Online (Sandbox Code Playgroud)
我首先尝试使用Argonauts decodeValidation方法,该方法返回Validation [String,X].不幸的是,我需要一个错误列表.
有什么建议?
我正在尝试从Haskell服务器获取一些JSON数据,但我遇到了Respondeable实例,以及一般的Affjax.我已经使用Data.Argonaut.Generic.Aeson(GA)定义了EncodeJson + DecodeJson,但我无法弄清楚如何将其与Respondeable实例相匹配并且它来自响应函数.
它给了我错误"无法匹配类型外部与类型Json"但是可以重用我的decodeJson实例而不必手动创建任何其他东西吗?也许通过创建一个IsForeign实例,但使用GA.decodeJson?我只是不确定如何去做.我已经看到它是如何在https://github.com/purescript/purescript-foreign/blob/master/examples/Complex.purs手动完成的,但我有复杂的类型需要与我的Haskell JSON输出相匹配,手动完成这将是一个巨大的痛苦.
我正在使用purescript 10.7,Affjax 3.02和argonaut 2.0.0,以及argonaut-generic-codecs 5.1.0.谢谢!
testAffjax :: forall eff. Aff (ajax :: AJAX | eff) (Answer)
testAffjax = launchAff do
res <- affjax $ defaultRequest { url = "/", method = Left GET }
pure res.response
data Answer = Answer {
_answer :: String
, _isCorrect :: Boolean
, _hint :: String
}
{- PROBLEM -}
instance respondableAnswer :: Respondable Answer where
responseType = Tuple Nothing JSONResponse
fromResponse = GA.decodeJson {- Error here …Run Code Online (Sandbox Code Playgroud) 我有一份 json 格式的成绩单,里面有一堆单词
{
"words": [{
"duration": 123,
"name": "world"
"time": 234,
"speaker": null
}]
}
Run Code Online (Sandbox Code Playgroud)
我一直在使用 Circe 来编码/解码 Json。在这种特殊情况下:
import io.circe.generic.auto._
import io.circe.parser._
val decoded = decode[Transcript](transcriptJson)
Run Code Online (Sandbox Code Playgroud)
我的 ADT 看起来像:
case class Word(
duration: Double,
name: String,
time: Float,
para: String,
speaker: Option[String],
key: Option[String] = None,
strike: Option[String] = None,
highlight: Option[String] = None
)
case class Transcript(words: List[Word])
Run Code Online (Sandbox Code Playgroud)
有时单词有像“strike”或“highlight”这样的键,但很可能没有。如果没有,我会收到以下错误消息。
Left(DecodingFailure([A]List[A], List(DownField(highlight), MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, …Run Code Online (Sandbox Code Playgroud)