<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi Masaki,<div class=""><br class=""></div><div class="">Do you mean that you are going through the JSON as a string value and changing the keys, then you want to pass this re-written JSON to the decoder?</div><div class=""><br class=""></div><div class="">- Tony<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jun 21, 2017, at 6:58 PM, Masaki Haga via swift-users &lt;<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div style="font-size:14px" class="">Hi Swift-Users,</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">I was wondering if there is any way to decode JSON from Any type JSON Object using `JSONDecoder`, not from Data type object.&nbsp;</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">Currently, `JSONDecoder` has only one decode function which decodes&nbsp;Data type object&nbsp;to `Decodable`. Inside the function, it serializes Data object to Any Type JSON Object using `JSONSerialization` and pass it into `_JSONDecoder(referencing:, options:)` (Refer JSONEncoder.swift#874).</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">As discussed in some of other threads such as "SE-0166: Swift Archival &amp; Serialization", the default implementation of JSONDecoder or Decodable protocol doesn’t allow to decode from one format to another format (such as snake-case to camel-case), we need to implement custom CodingKey enums. However, in our project, to parse the server API JSON response with snake-case, declaring custom CodingKey enums for all the pre-existing models is almost impossible and very inefficient, so I decided to covert all the JSON keys from snake-case to camel-case, and then pass it into `JSONDecoder.decode`. To achieve this, we need to convert the Data object resulted from `URLSession.task` to Any type JSON Object using `JSONSerialization`, do the conversion from snake-case to camel-case and then convert back to Data type and then pass to `JSONDecoder.decode` which looks very redundant because the function uses `JSONSerialization` inside of it as mentioned above. If there is a function like below, we can get rid of this redundant call of `JSONSerialization`.</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">```</div><div style="font-size:14px" class="">func decode&lt;T : Decodable&gt;(_ type: T.Type, from JSONObject: Any) throws -&gt; T</div><div style="font-size:14px" class="">```</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">Sorry if I am misunderstanding the new API but is there any way to decode `Decodable` directly from Any type JSON Object?</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">If not, I think adding the function aforementioned and giving an ability to opt-out this JSON serialization call would give more flexibility to the API in my humble opinion.</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">Thank you for reading.</div><div style="font-size:14px" class=""><br class=""></div><div style="font-size:14px" class="">All the best,</div><div style="font-size:14px" class="">- Masaki</div></div>
_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-users<br class=""></div></blockquote></div><br class=""></div></body></html>