[swift-corelibs-dev] JSONDecoder has too few opportunities. need an enhancement.

Itai Ferber iferber at apple.com
Fri Nov 10 11:22:29 CST 2017

Hi Vladimir,

> On Nov 9, 2017, at 8:36 AM, Vladimir Kushelkov via swift-corelibs-dev <swift-corelibs-dev at swift.org> wrote:
> 1. Sometimes it is contently to be able to decode a struct or an object from a Foundation object (either NSArray or NSDictionary) that produce a valid JSON.
> For example, if I use a 3d party library that provides NSDictionary to me. Due to JSONDecoder decodes only from Data, in the first place I have to convert NSDictionary to Data in order to use the one so far. But the decoder does the back action first thing.
> I created Pull Request <https://github.com/apple/swift/pull/12791>, that was closed.
Thanks for putting together this pull request! As Tony mentioned in his response to it, this type of change would need to go through API review, both internal, and external, before we could accept it.
This needs to be squared away with other work on JSONDecoder/PropertyListDecoder — you may have seen a recent email on here from Florent Vilmart about exposing the underlying _JSONEncoder and _JSONDecoder; we’re currently considering exposing the underlying conversion mechanism here in an Encoder/Decoder pair similar to Norio’s ObjectEncoder. There might be a more general solution here than just exposing the behavior on JSONDecoder.

This is being tracked internally, and I hope to have a good answer in the next Swift release. In the meantime, there are workarounds like what Norio has done.

> 2. Is it possible to use JSONDecoder when I don’t know the type of a particular property of the required type?
> For instance, if I develop a library that allows bi-directional communication between server and client. The library wraps transmitted data into an internal object in a way that one of the object’s properties is the data. So, the type of the property is unknown inside the library. I want to decode the internal object with JSONDecoder, but I can’t specify the type of one property.
No, this is not possible. You cannot decode an object without being able to specify its type statically — you’ll need the client to somehow pass along the type, or provide enough information for you to decode on their behalf.

> _______________________________________________
> swift-corelibs-dev mailing list
> swift-corelibs-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-corelibs-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-corelibs-dev/attachments/20171110/23bf23ec/attachment.html>

More information about the swift-corelibs-dev mailing list