I assume this issue affects other implementations of Encoder and Decoder as 
well. The most obvious way to represent a key with multiple types is an enum, 
but enums don’t have their conformances to Codable generated automatically. 
It’s possible to write your own, but it can get a bit ugly (e.g., 
https://gist.github.com/kenada/9acbd7200cff3590bda5e83118f62523 
<https://gist.github.com/kenada/9acbd7200cff3590bda5e83118f62523>).

-- 
Randy

> On Jun 23, 2017, at 1:14 PM, Jon Shier via swift-users 
> <swift-users@swift.org> wrote:
> 
> Itai:
> 
> No need to apologize, I do appreciate the difficulties of designing this 
> entire feature as quickly and completely as was required. 
> 
> An intermediate JSON type would be a great fix, though most useful if it 
> exists outside of JSONDecoder so it's useful for encoding as well. As long as 
> it can be initialize from outside and decoded on its own, I think it could 
> solve much of that issue. 
> 
> 
> Jo 
> 
> On Jun 23, 2017, at 12:54 PM, Itai Ferber <ifer...@apple.com 
> <mailto:ifer...@apple.com>> wrote:
> 
>> Hi Jon,
>> 
>> I just joined this mailing list and have tried to catch up on the history of 
>> this thread, so please excuse me if I’ve missed something.
>> 
>> I’m sorry the Codable API at the moment does not answer your needs — you’re 
>> clearly not the only one who’s run into this, so let’s see how we can work 
>> together to make the API better for everyone.
>> For one thing, in the case of grabbing a subtree of JSON as "unevaluated" or 
>> "unmapped" (as it appears to be in the metadata case), it should be fairly 
>> simple to add a JSONDecoder.UnevaluatedJSON type that will allow you to 
>> essentially decode that part of the tree as an Any. JSONDecoder would have 
>> knowledge of this type and would be able to return the subtree inside of it 
>> — you’d decode a property as JSONDecoder.UnevaluatedJSON.self and access the 
>> contents through var value: Any?, or something similar. This would be simple 
>> additive API, which although might not make it in the upcoming betas, should 
>> be fairly simple introduce. Would this solve that use case?
>> 
>> We’re also working on improving NSISO8601DateFormatter. I don’t think I saw 
>> it in any of your emails — what specific use case are you looking for that 
>> it doesn’t at the moment support?
>> 
>> — Itai
>> 
>> On 23 Jun 2017, at 9:24, Jon Shier via swift-users wrote:
>> 
>> David:
>>      I never called the design silly (though I think it’s inadequate for 
>> some important usage and makes some strange decisions), I was referring to 
>> the fact that the (apparent) official solution can’t actually decode all of 
>> the JSON people use. It’s the same reason I brought up 
>> NSISO8601DateFormatter. After years of using third party libraries or 
>> writing your own, limited, implementation, finally, finally there was an 
>> official solution from Apple. The official 8601 date formatter. Only, come 
>> to find out, it doesn’t actually handle all of 8601 and those third party 
>> libraries or custom implementations are still required if you venture 
>> outside supported scenarios. I’m concerned about the same thing happening 
>> here. Now, if JSONDecoder isn’t actually intended to serve as a general JSON 
>> parsing solution, which I think would be surprising to a lot people, then 
>> fair enough. Apple and the Swift team just need to be far more clear that 
>> that’s the case, rather letting everyone believe otherwise. And frankly, if 
>> that’s the case, I think a huge opportunity has been missed. At the same 
>> time, if / when an official solution for JSON parsing comes out, or an 
>> actual JSON representation, how will it interact with the previous 
>> implementation?
>>      These concerns, and the general concerns I expressed during the 
>> evolution review (which still exist) aside, this is fixable, if the Swift 
>> team is interested in doing so. However, if the limitations of JSONDecoder 
>> aren’t even seen as limitations, or interest in fixing them aren’t there, 
>> then there’s little point to continuing the discussion. Something as simple 
>> as an additional decode(_ type: from: Any) on JSONDecoder would solve the 
>> issues with decoding partially deserialized blobs or representations from 
>> other APIs. Something to help represent Any in Codable types might be 
>> useful, though I recognize that there isn’t any way to currently 
>> differentiate between Codable types and those just used by JSON. 
>>      All of that said, my concerns mainly lie within the JSON realm. Codable 
>> works great for serialization to disk or other scenarios where I can just 
>> deal with the Data result and not have to worry about weakly typed 
>> intermediate results. I’ll certainly be using it everywhere I can. And I’m 
>> super happy that conformance is generated by the compiler rather than 
>> manually, like we had to do with Objective-C for over a decade. Even the 
>> JSON side is useful if I can control both sides of the API, which makes 
>> Swift on the server very powerful.
>>      So if I seem overly strident in my expression here it’s because I 
>> experience the pain of consuming poorly designed JSON in Swift on 
>> practically a daily basis and had hoped that a native implementation would 
>> alleviate that. That it doesn’t, for me and others, currently, is very 
>> disappointing. That the Swift team doesn’t seem to see the current 
>> limitations as important or at all is doubly so, since it seems like these 
>> issues will never be fixed.  
>> 
>> 
>> 
>> Jon
>> 
>> 
>>> On Jun 23, 2017, at 4:34 AM, David Hart <da...@hartbit.com 
>>> <mailto:da...@hartbit.com>> wrote:
>>> 
>>> 
>>> On 23 Jun 2017, at 03:45, Jon Shier via swift-users <swift-users@swift.org 
>>> <mailto:swift-users@swift.org>> wrote:
>>> 
>>>>    I’m sorry, are you complaining about my use of Codable instead of more 
>>>> precisely referring to the JSON endcode/decode functionality based on it 
>>>> in Foundation, or are you honestly trying to say that said functionality 
>>>> was never intended to be a general purpose JSON solution? If it’s not 
>>>> actually intended to handle all JSON you should probably call it something 
>>>> else.
>>> 
>>> Hi Jon,
>>> 
>>> First of all, I'd like to point out that I've found your tone to be quite 
>>> rude. Calling the design of Codable, that has gotten a lot of work from 
>>> Apple and swift-evolution, as silly is insulting and can leave people hurt. 
>>> If you have found it lacking, please say so: we're all here to discuss any 
>>> feedback people have had with Swift. But please do so with respect for the 
>>> people and the work behind it.
>>> 
>>> Now, concerning Codable, I find its name quite apt. It was never intended 
>>> to be used a full JSON parser but as a strongly-typed Swift equivalent of 
>>> Objective-C's NSCoding, which is nothing more than a framework for 
>>> serializing and deserializing types into different file formats.
>>> 
>>> David.
>>> 
>>>> Jon
>>>> 
>>>>> On Jun 22, 2017, at 9:42 PM, Greg Parker <gpar...@apple.com 
>>>>> <mailto:gpar...@apple.com>> wrote:
>>>>> 
>>>>> 
>>>>>> On Jun 22, 2017, at 6:00 PM, Jon Shier via swift-users 
>>>>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>>>>> 
>>>>>>  My main concern here is that, as Swift’s official JSON parsing method, 
>>>>>> Codable should be able to handle any JSON representation and use and it 
>>>>>> doesn’t. 
>>>>> 
>>>>> Is this true? Is Codable intended to be Swift's official JSON parsing 
>>>>> system? Is Codable intended to be a general-purpose JSON parsing system? 
>>>>> 
>>>>> My understanding was that Codable was designed to serialize Swift types, 
>>>>> not to be able to import arbitrary JSON text into Swift nor to 
>>>>> interoperate with every existing JSON API.
>>>>> 
>>>>> 
>>>>> -- 
>>>>> Greg Parker     gpar...@apple.com <mailto:gpar...@apple.com>     Runtime 
>>>>> Wrangler
>>>>> 
>>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-users 
>>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users 
>> <https://lists.swift.org/mailman/listinfo/swift-users>
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to