Thanks Norbert, that's great. I won't be able to get back to this project
for another week or two (some stuff has come up) but will let you know if I
have any questions.

On Thu, Jan 10, 2019 at 2:52 AM Norbert Hartl via Pharo-users <
pharo-users@lists.pharo.org> wrote:

> Hi Eric,
>
> I‘m late to the game but I‘m interested to talk abd cooperate. I
> implemented JSON schema  [1] not long ago. This can also be used to add a
> mapping from object to json. It has also a type key inside the json object.
> I did it with an intermediate object. The JSONSchemaDefinition is a super
> type of all JSON schema types meaning one json object containing all keys
> of all types. I read the super type and then with a visitor
> I explode this super type into concrete type objects. As you say on
> writing I use the concrete objects. The asymmetry is also a bit tricky but
> in the end the best approach so far. So if you like we can talk. I think
> that it could be a good idea to think about how JSON Schema and JSON LD
> could fit together.
>
> Norbert
>
>
> [1] https://github.com/zweidenker/JSONSchema
>
> Am 09.01.2019 um 22:27 schrieb Eric Gade <eric.g...@gmail.com>:
>
> Hi Sven, thanks for the response.
>
> Unfortunately since I'm working with a standard here, there is always
> going to be an explicit `"type": <foo>` attribute rather than having the
> key itself be the name of the type. I guess I'll stick to the two-pass read
> solution. But the writing solution can use the mapping so that saves a lot
> of trouble!
>
>
> On Wed, Jan 9, 2019 at 3:14 PM Sven Van Caekenberghe <s...@stfx.eu> wrote:
>
>> Eric,
>>
>> > On 9 Jan 2019, at 00:34, Eric Gade <eric.g...@gmail.com> wrote:
>> >
>> > Hey guys,
>> >
>> > I'm toying with the idea of a Pharo implementation of ActivityStreams (
>> https://www.w3.org/TR/activitystreams-core/#introduction) which is based
>> on a subset of JSON called JSON-LD (for "linked data").
>> >
>> > While I do not believe this would entail creating a whole JSON-LD
>> implementation, I do have a question about how to implement
>> reading/writing/mapping to and from the core set of object types in the
>> specification.
>> >
>> > I am aware that giving any class #neoJsonMapping allows one to define
>> the specifics of the mapping to and from objects of that class (I think
>> this is super cool, by the way). The issue with ActivityStreams objects is
>> that the "type" of object they represent is in the JSON itself as the
>> property "type," for example:
>> >
>> > ```
>> > {
>> > "@context": "https://www.w3.org/ns/activitystreams";,
>> > "name": "A simple note",
>> > "type": "Note",
>> > "id": "http://www.test.example/notes/1";,
>> > "content": "A simple note",
>> > "replies": {
>> >      "type": "Collection",
>> >      "totalItems": 1,
>> >      "items": [
>> >          {
>> >              "name": "A response to the note",
>> >              "type": "Note",
>> >              "content": "A response to the note",
>> >              "inReplyTo": "http://www.test.example/notes/1";
>> >          }
>> >      ]
>> > }
>> > }
>> > ```
>> >
>> > This refers to a top level ActivityStream object of type "Note" which
>> we maybe want to parse into something like `ASNote`.
>> >
>> > My core question is this: how can we get a NeoJSONReader to determine
>> which type of object to create by checking for a "type" property as soon as
>> possible in the process? Because this property can show up in any order, we
>> won't know what type of object to create until it is encountered. What is
>> the best strategy there?
>> >
>> > Does the complexity suggest that we should simply parse incoming
>> ActivityStream objects into the collection-and-dict default mapping and
>> deal with creating the appropriate objects after that? In this case we
>> could still use the custom mapping for the writing, which is not a problem
>> since the "type" field will be associated with the class (ie, ASNote class
>> >> #type will respond with 'Note' and we can go from there).
>> >
>> > Any thoughts or suggestions much appreciated!
>>
>> You describe the situation correctly: NeoJSON operates in 2 modes:
>>
>> (1) generating generic Arrays and Dictionaries (just like the spec)
>>
>> or
>>
>> (2) optionally mapping, stream based, directly, without intermediary
>> representation, into domain instances (given a predefined static mapping)
>>
>> Using NeoJSONObject instead of Dictionary is just a convenience (it being
>> a more JS like object).
>>
>> There is indeed another approach, using dynamic typing, that is not
>> specifically supported in NeoJSON.
>>
>> As you remark yourself, that requires an intermediary representation, so
>> one could just as well use option (1) and convert 'manually' in a second
>> pass.
>>
>> That being said, it could/would be a nice addition to offer some support
>> for this. Although there are multiple slightly different approaches. For
>> example, there also is
>>
>> {
>>   "Point" : { "x" : 1, "y" : 2 }
>> }
>>
>> Instead of
>>
>> {
>>   "_type" : "Point",
>>   "x" : 1,
>>   "y" : 2
>> }
>>
>> The key for the type/class can be different, the value can be anything,
>> even 'com.java.graphics.Point'.
>>
>> Note also that typically, there are no collection types (and these would
>> be way more complicated).
>>
>> Sven
>>
>> > --
>> > Eric
>>
>>
>>
>
> --
> Eric
>
>

-- 
Eric

Reply via email to