33
33
*/
34
34
package algoliasearch .composition
35
35
36
- import org .json4s .MonadicJValue .jvalueToMonadic
37
- import org .json4s .{Extraction , Formats , JField , JObject , JValue , Serializer , TypeInfo }
36
+ import org .json4s ._
38
37
39
38
/** BaseSearchResponse
40
39
*
@@ -99,7 +98,7 @@ case class BaseSearchResponse(
99
98
exhaustiveNbHits : Option [Boolean ] = scala.None ,
100
99
exhaustiveTypo : Option [Boolean ] = scala.None ,
101
100
facets : Option [Map [String , Map [String , Int ]]] = scala.None ,
102
- facetsStats : Option [Map [String , FacetStats ]] = scala.None ,
101
+ facetsStats /* facets_stats */ : Option [Map [String , FacetStats ]] = scala.None ,
103
102
index : Option [String ] = scala.None ,
104
103
indexUsed : Option [String ] = scala.None ,
105
104
message : Option [String ] = scala.None ,
@@ -114,19 +113,29 @@ case class BaseSearchResponse(
114
113
serverUsed : Option [String ] = scala.None ,
115
114
userData : Option [Any ] = scala.None ,
116
115
queryID : Option [String ] = scala.None ,
117
- automaticInsights : Option [Boolean ] = scala.None ,
116
+ automaticInsights /* _automaticInsights */ : Option [Boolean ] = scala.None ,
118
117
additionalProperties : Option [List [JField ]] = None
119
118
)
120
119
121
120
class BaseSearchResponseSerializer extends Serializer [BaseSearchResponse ] {
122
121
122
+ private val renamedFields = Map [String , String ](
123
+ " facets_stats" -> " facetsStats" ,
124
+ " _automaticInsights" -> " automaticInsights"
125
+ )
123
126
override def deserialize (implicit format : Formats ): PartialFunction [(TypeInfo , JValue ), BaseSearchResponse ] = {
124
127
case (TypeInfo (clazz, _), json) if clazz == classOf [BaseSearchResponse ] =>
125
128
json match {
126
129
case jobject : JObject =>
130
+ // Rename fields from JSON to Scala
131
+ val renamedObject = JObject (
132
+ jobject.obj.map { field =>
133
+ renamedFields.get(field._1).map(JField (_, field._2)).getOrElse(field)
134
+ }
135
+ )
127
136
val formats = format - this
128
137
val mf = manifest[BaseSearchResponse ]
129
- val obj = Extraction .extract[BaseSearchResponse ](jobject )(formats, mf)
138
+ val obj = Extraction .extract[BaseSearchResponse ](renamedObject )(formats, mf)
130
139
131
140
val fields = Set (
132
141
" abTestID" ,
@@ -139,7 +148,7 @@ class BaseSearchResponseSerializer extends Serializer[BaseSearchResponse] {
139
148
" exhaustiveNbHits" ,
140
149
" exhaustiveTypo" ,
141
150
" facets" ,
142
- " facetsStats " ,
151
+ " facets_stats " ,
143
152
" index" ,
144
153
" indexUsed" ,
145
154
" message" ,
@@ -154,13 +163,13 @@ class BaseSearchResponseSerializer extends Serializer[BaseSearchResponse] {
154
163
" serverUsed" ,
155
164
" userData" ,
156
165
" queryID" ,
157
- " automaticInsights "
166
+ " _automaticInsights "
158
167
)
159
168
val additionalProperties = jobject removeField {
160
169
case (name, _) if fields.contains(name) => true
161
170
case _ => false
162
171
}
163
- additionalProperties.values match {
172
+ additionalProperties match {
164
173
case JObject (fieldsList) => obj copy (additionalProperties = Some (fieldsList))
165
174
case _ => obj
166
175
}
@@ -170,9 +179,13 @@ class BaseSearchResponseSerializer extends Serializer[BaseSearchResponse] {
170
179
171
180
override def serialize (implicit format : Formats ): PartialFunction [Any , JValue ] = { case value : BaseSearchResponse =>
172
181
val formats = format - this // remove current serializer from formats to avoid stackoverflow
182
+ val baseObj = Extraction .decompose(value.copy(additionalProperties = None ))(formats)
183
+ val renamedObj = baseObj transformField {
184
+ case JField (name, value) if renamedFields.exists(_._2 == name) => (renamedFields.find(_._2 == name).get._1, value)
185
+ }
173
186
value.additionalProperties match {
174
- case Some (fields) => Extraction .decompose(value.copy(additionalProperties = None ))(formats) merge JObject (fields)
175
- case None => Extraction .decompose(value)(formats)
187
+ case Some (fields) => renamedObj merge JObject (fields)
188
+ case None => renamedObj
176
189
}
177
190
}
178
191
}
0 commit comments