问题标签 [spray-json]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2464 浏览

json - 实体类中的scala spray json可选id参数

我正在使用 Salat 库将案例类序列化为 mongoDb 对象。我的 Item.scala 文件如下所示:

现在,我使用它通过 Spray HTTP 将 Item 实体发布为 Json。我想按如下方式调用它:

如果我不提供,希望它会提供生成的 id。

但是,在调用 curl 命令后,我收到一个错误:

请求内容格式错误:对象缺少必需的成员“_id”

有什么方法可以将 _id 字段标记为可选而不使 Option 不在其中(该字段将始终设置)并定义自定义 JsonFormat 从而自己(反)序列化对象?

我读过这篇文章:https ://stackoverflow.com/a/10820293/1042869 ,但我想知道是否还有其他方法可以做到这一点,因为我有很多 _id 字段的情况。也有一条评论说“您可以在案例类定义中为该字段指定默认值,因此如果该字段不在 json 中,它将为其分配默认值。”,但正如您在此处看到的它似乎不起作用。

最好的,马辛

0 投票
1 回答
1077 浏览

scala - 通用喷涂客户端

我正在尝试使用喷雾在 Scala 中创建一个通用的 HTTP 客户端。这是类定义:

对象utils.AllJsonFormats具有以下声明。它包含所有模型格式。在“另一端”使用相同的类,即我还编写了 API,并在那里使用了与 spray-can 和 spray-json 相同的格式化程序。

当然,该对象具有对 models.api.Space、models.api.Failure 和 models.api.Success 序列化的定义。

类型看起来不错,即当Space我告诉泛型方法它将接收并返回 aSpace时,没有错误。但是,一旦我将 Either 带入方法调用,就会出现以下编译器错误:

找不到 spray.httpx.unmarshalling.Unmarshaller[Either[models.api.Failure,models.api.Success]] 类型的证据参数的隐式值。

我的期望是spray.json.DefaultJsonProtocol 中隐含的,即spray.json.StandardFormts 中的隐含内容,可以覆盖我。

以下是我的 HttpClient 类,尝试最好是通用的: 更新:更清晰/可重复的代码示例

有了上述,问题仍然出现在 unmarshaller 未解决的地方。帮助将不胜感激..

谢谢。

0 投票
3 回答
7458 浏览

scala - Spray 不会将我的案例类转换为 json 并期待一个 spray.httpx.marshalling.ToResponseMarshallable

我正在尝试重新处理这个这个,但我不断收到一个我无法修复的错误......

首先,这是我的依赖项:

现在我想做的是:

和:

现在我得到这个错误:

我尝试了很多东西,但无法让它发挥作用。我试过了

最后我所做的是

这可行,但是当我需要 application/json 时,它会作为 Content-Type: text/plain 发送给客户端。

有人看到这里有什么问题吗?

编辑:我在 github https://github.com/ydemartino/spray-test上添加了一个示例项目

0 投票
1 回答
5570 浏览

json - 将 DateTime 转换为 JSON 字符串

我想将带有Option[DateTime]参数的案例类转换为可以由 API 提供的 spray-json 对象。使用 spray-json 我有一个自定义的 JsonFormat

但我得到:

当我尝试编译它时,无论我尝试什么,我似乎都无法将 DateTime 对象转换为字符串。例如,当我尝试打电话时,toString我得到

0 投票
1 回答
3036 浏览

scala - 在 spray-json 中返回带有对象属性子集的 json 响应

我有一个 API 类,灵感来自我正在编写的喷雾 scala 演示,它将在喷雾路线中将 Person 呈现为 JSON 对象

问题是 marshal(bob) 像这样返回 JSON:

想象一下,我需要像这样渲染没有“年龄”的 JSON:

这怎么可能实现?我的一个想法是 Scala 是否有办法制作一个对象,它是另一个对象的属性的子集?或者也许 spray-json 会对不编组不应添加到服务器响应中的属性提供一些特定的支持?

0 投票
1 回答
557 浏览

scala - [Spray Client]:Facebook 图形 API 返回错误的内容类型

盯着Spray Library,我尝试向 Facebook Graph API 发出请求:

主要问题是响应的内容类型 Content-Type: text/javascript; charset=UTF-8 不是预期的application/json

我的请求到底有什么问题?

由于Spray严重依赖于内容类型进行解析等。

0 投票
1 回答
434 浏览

json - spray-json - diverging implicit expansion

I'm attempting to interface with the RescueTime API via spray-json. Results are of the form:

As of yet, I'm attempting to hash out the right case classes. Here's what I've got so far:

This is all well and good, but at compile time scalac yields:

My understanding of diverging implicit expansion is rough at best. Roughly, there is a cycle in implicit search. As I understand, the toJson implicit comes from the spray.json._ import which expects a JsonWriter implicit parameter. This, in turn, is provided by the MyJsonProtocol object. However, why this particular implicit parameter introduces a cycle is beyond me. One theory is toJson conversion which applies to Any might be interfering with the implicit parameter resolution, but that's just a hunch.

Any help is greatly appreciated.

0 投票
2 回答
14040 浏览

scala - 使用喷雾 json 序列化 Map[String, Any]

如何使用 spray-json 序列化 Map[String, Any]?我试试

它说Cannot find JsonWriter or JsonFormat type class for scala.collection.immutable.Map[String,Any]

0 投票
2 回答
6725 浏览

scala - 使用自定义 JsonFormats 在喷雾路由中进行喷雾 json 序列化

将 Spray 与 spray-json 一起用于系统,版本:

我不知道如何让自定义 JsonFormat 定义为喷雾路由处理的序列化工作。

我有两种不同的情况都失败了。

1. 嵌套案例类

基本案例类 JSON 序列化工作正常

但是,如果我在要序列化的案例类中有一个嵌套的案例类,我可以通过提供另一个 JsonFormat 隐式来解决编译问题,但在运行时它拒绝序列化

这将在运行时抛出 MappingException,说明子记录没有可用值

2. 具有各种 0-N 案例扩展的特征

在这里,我有一个 trait 可以作为一组案例类的捕获类型。一些扩展类有 vals,而另一些没有 vals 并且是对象。当发生序列化时,似乎我的隐式定义的 JsonFormat 被完全忽略了,我只是给出了一个空的 JsObject,特别是当实际的底层类型是没有 val 的 case 对象之一时。

所以鉴于上述情况,如果被序列化的实际类型是 EntityNotFound,那么序列化就变成 RootJsonFormat 变成{}. 如果它是一个 ErrorsWithReason 那么它变成一个 RootJsonFormat 变成{ "reason": "somevalue" }. 我可能对 JsonFormat 定义应该如何工作感到困惑,但它似乎根本没有使用我的 write 方法,而是突然想出了如何自行序列化。

编辑

特定的序列化案例正在使用读取/反序列化,例如:

complete并使用指令编写/序列化。

由于此处发布的第一个答案,我现在意识到我的 JsonDefaultProtocol 和 JsonFormat 实现适用于 spray-json 类,同时反序列化中的实体指令提取使用 json4s JObject 而不是 spray-json JsObject。

0 投票
1 回答
1089 浏览

scala - spray-json 和 spray-routing:如何完整调用 JsonFormat 写入

我试图弄清楚如何在使用路由指令完成时调用自定义 JsonFormat 写入方法。使用 jsonFormat 帮助函数集创建的 JsonFormat 可以正常工作,但不会调用定义完整的 JsonFormat。

然后是这样的路线:

如果我添加日志记录,我可以看到 ErrorJsonFormat.write 方法永远不会被调用。

后果如下所示,显示了我想要获得的输出和实际获得的输出。假设 Record 实例是 Record("something", "somethingelse", EntityNotFound)

实际的

故意的

我期待complete(record)使用隐式 JsonFormat for Record ,这又依赖于隐式对象 ErrorJsonFormat ,该对象指定创建适当 JsString 字段的写入方法。相反,它似乎既能识别提供的 ErrorJsonFormat 而忽略其序列化指令。

我觉得应该有一个不需要implicit val record2Json = jsonFormat3(Record)用显式替换的解决方案implicit object RecordJsonFormat extends JsonFormat[Record] { ... }

所以总结一下我在问什么

  • 为什么Record的序列化调用ErrorJsonFormat写入方法失败(它甚至做了什么?)在下面回答
  • 有没有办法在使用的同时满足我的期望complete(record)

编辑

翻遍spray-json源码,有一个sbt-boilerplate模板好像定义了jsonFormat系列方法:https ://github.com/spray/spray-json/blob/master/src/main/boilerplate/喷雾/json/ProductFormatsInstances.scala.template

和 jsonFormat3 的相关产品似乎是:

由此看来, jsonFormat3 本身是非常好的(如果你追踪到 productElement2Field 它会抓住 writer 并直接调用 write)。那么问题必须是complete(record)根本不涉及 JsonFormat 并且以某种方式交替编组对象。

所以这似乎回答了第 1 部分:为什么 Record 的序列化无法调用 ErrorJsonFormat 写入方法(它甚至做了什么?)。没有 JsonFormat 被调用,因为通过其他方式完成编组。

剩下的问题似乎是是否可以为完整的指令提供一个编组器,如果 JsonFormat 存在,它将使用它,否则默认为其正常行为。我意识到我通常可以依赖默认编组器进行基本案例类序列化。但是当我得到一个像这个例子中那样复杂的特征/案例类设置时,我需要使用 JsonFormat 来获得正确的响应。理想情况下,对于编写路由的人来说,这种区别不必很明确,因为他们需要知道其默认编组器的情况,而不是需要调用 JsonFormat。或者换句话说,需要区分给定类型是否需要写成complete(someType)complete(someType.toJson)感觉错误。