@@ -34,7 +34,12 @@ trait PlayJsonJsonapiFormat {
34
34
JsArray (values)
35
35
}
36
36
37
- override def reads (json : JsValue ): JsResult [Data ] = ???
37
+ override def reads (json : JsValue ): JsResult [Data ] = {
38
+ json.asOpt[ResourceObject ] match {
39
+ case Some (ro) ⇒ JsSuccess (ro)
40
+ case None ⇒ JsSuccess (ResourceObjects (json.as[ImmutableSeq [ResourceObject ]]))
41
+ }
42
+ }
38
43
}
39
44
40
45
/**
@@ -85,7 +90,22 @@ trait PlayJsonJsonapiFormat {
85
90
JsObject (fields)
86
91
}
87
92
88
- override def reads (json : JsValue ): JsResult [Meta ] = ???
93
+ override def reads (json : JsValue ): JsResult [Meta ] = json match {
94
+ case JsObject (fields) ⇒
95
+ fields.foldLeft[JsResult [Meta ]](JsSuccess (Vector .empty)) {
96
+ case (acc, (name, jsValue)) ⇒ (acc, jsValue.validate[JsonApiObject .Value ]) match {
97
+ case (JsSuccess (metaProps, _), JsSuccess (value, _)) ⇒
98
+ JsSuccess (metaProps :+ MetaProperty (name, value))
99
+ case (JsSuccess (_, _), JsError (errors)) ⇒
100
+ JsError (Seq (JsPath \ name -> errors.flatMap(_._2)))
101
+ case (e : JsError , s : JsSuccess [_]) ⇒
102
+ e
103
+ case (e : JsError , JsError (errors)) ⇒
104
+ e ++ JsError (Seq (JsPath \ name -> errors.flatMap(_._2)))
105
+ }
106
+ }
107
+ case _ ⇒ JsError (" error.expected.jsobject" )
108
+ }
89
109
}
90
110
91
111
/**
@@ -97,7 +117,22 @@ trait PlayJsonJsonapiFormat {
97
117
JsObject (fields)
98
118
}
99
119
100
- override def reads (json : JsValue ): JsResult [JsonApi ] = ???
120
+ override def reads (json : JsValue ): JsResult [JsonApi ] = json match {
121
+ case JsObject (fields) ⇒
122
+ fields.foldLeft[JsResult [JsonApi ]](JsSuccess (Vector .empty)) {
123
+ case (acc, (name, jsValue)) ⇒ (acc, jsValue.validate[JsonApiObject .Value ]) match {
124
+ case (JsSuccess (jsonApiProps, _), JsSuccess (value, _)) ⇒
125
+ JsSuccess (jsonApiProps :+ JsonApiProperty (name, value))
126
+ case (JsSuccess (_, _), JsError (errors)) ⇒
127
+ JsError (Seq (JsPath \ name -> errors.flatMap(_._2)))
128
+ case (e : JsError , s : JsSuccess [_]) ⇒
129
+ e
130
+ case (e : JsError , JsError (errors)) ⇒
131
+ e ++ JsError (Seq (JsPath \ name -> errors.flatMap(_._2)))
132
+ }
133
+ }
134
+ case _ ⇒ JsError (" error.expected.jsobject" )
135
+ }
101
136
}
102
137
103
138
/**
@@ -109,7 +144,21 @@ trait PlayJsonJsonapiFormat {
109
144
JsArray (fields)
110
145
}
111
146
112
- override def reads (json : JsValue ): JsResult [Errors ] = ???
147
+ override def reads (json : JsValue ): JsResult [Errors ] = json match {
148
+ case JsArray (a) ⇒ a.foldLeft[JsResult [Errors ]](JsSuccess (Vector .empty)) {
149
+ case (acc, jsValue) ⇒ (acc, jsValue.validate[Error ]) match {
150
+ case (JsSuccess (errs, _), JsSuccess (value, _)) ⇒
151
+ JsSuccess (errs :+ value)
152
+ case (JsSuccess (_, _), JsError (errors)) ⇒
153
+ JsError (errors)
154
+ case (e : JsError , s : JsSuccess [_]) ⇒
155
+ e
156
+ case (e : JsError , JsError (errors)) ⇒
157
+ e ++ JsError (errors)
158
+ }
159
+ }
160
+ case _ ⇒ JsError (" error.expected.jsarray" )
161
+ }
113
162
}
114
163
115
164
/**
@@ -150,12 +199,32 @@ trait PlayJsonJsonapiFormat {
150
199
case JsonApiObject .StringValue (s) ⇒ JsString (s)
151
200
case JsonApiObject .NumberValue (n) ⇒ JsNumber (n)
152
201
case JsonApiObject .BooleanValue (b) ⇒ JsBoolean (b)
153
- case JsonApiObject .JsObjectValue (o) ⇒ JsObject (o.map (a ⇒ a.name -> Json .toJson[ JsonApiObject . Value ] (a.value)))
202
+ case JsonApiObject .JsObjectValue (o) ⇒ JsObject (o.map (a ⇒ a.name -> Json .toJson(a.value)))
154
203
case JsonApiObject .JsArrayValue (a) ⇒ JsArray (a.map(v ⇒ Json .toJson[JsonApiObject .Value ](v)))
155
204
case JsonApiObject .NullValue ⇒ JsNull
156
205
}
157
206
158
- override def reads (json : JsValue ): JsResult [Value ] = ???
207
+ override def reads (json : JsValue ): JsResult [Value ] = json match {
208
+ case JsString (s) ⇒ JsSuccess (JsonApiObject .StringValue (s))
209
+ case JsNumber (n) ⇒ JsSuccess (JsonApiObject .NumberValue (n))
210
+ case JsBoolean (b) ⇒ JsSuccess (JsonApiObject .BooleanValue (b))
211
+ case JsObject (o) ⇒ {
212
+ val attrs = o.map(keyValue ⇒ {
213
+ val (key, jsValue) = keyValue
214
+ val read = reads(jsValue).getOrElse(JsonApiObject .NullValue )
215
+ Attribute (key, read)
216
+ }).toList
217
+ JsSuccess (JsonApiObject .JsObjectValue (attrs))
218
+ }
219
+ case JsArray (a) ⇒ {
220
+ val arrayValues = a.map(jsValue ⇒ {
221
+ reads(jsValue).getOrElse(JsonApiObject .NullValue )
222
+ }).toList
223
+ JsSuccess (JsonApiObject .JsArrayValue (arrayValues))
224
+ }
225
+ case JsNull ⇒ JsSuccess (JsonApiObject .NullValue )
226
+ case _ ⇒ JsError (" error.expected.jsonapivalue" )
227
+ }
159
228
}
160
229
161
230
/**
@@ -177,7 +246,20 @@ trait PlayJsonJsonapiFormat {
177
246
JsObject (fields)
178
247
}
179
248
180
- override def reads (json : JsValue ): JsResult [Links ] = ???
249
+ override def reads (json : JsValue ): JsResult [Links ] = json match {
250
+ case JsObject (o) ⇒ JsSuccess (o.map { keyValue ⇒
251
+ keyValue match {
252
+ case (FieldNames .`about`, JsString (u)) ⇒ Links .About (u)
253
+ case (FieldNames .`first`, JsString (u)) ⇒ Links .First (u)
254
+ case (FieldNames .`last`, JsString (u)) ⇒ Links .Last (u)
255
+ case (FieldNames .`next`, JsString (u)) ⇒ Links .Next (u)
256
+ case (FieldNames .`prev`, JsString (u)) ⇒ Links .Prev (u)
257
+ case (FieldNames .`related`, JsString (u)) ⇒ Links .Related (u)
258
+ case (FieldNames .`self`, JsString (u)) ⇒ Links .Self (u)
259
+ }
260
+ }.toVector)
261
+ case _ ⇒ JsError (" error.expected.links" )
262
+ }
181
263
}
182
264
183
265
/**
@@ -189,6 +271,7 @@ trait PlayJsonJsonapiFormat {
189
271
JsArray (objects)
190
272
}
191
273
192
- override def reads (json : JsValue ): JsResult [Included ] = ???
274
+ override def reads (json : JsValue ): JsResult [Included ] =
275
+ JsSuccess (Included (ResourceObjects (json.as[ImmutableSeq [ResourceObject ]])))
193
276
}
194
277
}
0 commit comments