[Seaside] Seaside Json serialization for Dictionary, Collection does not recursive jsonOn: aStream ?

Julian Fitzell jfitzell at gmail.com
Sun Jan 31 19:03:35 UTC 2010


Hi Bart,

Your analysis looks about right to me. It's not a known bug - there just
aren't really any users of the JSON stuff yet and I suspect none of them are
encoding custom classes.

Care to submit a fix? Either way, you could create an issue at
http://code.google.com/p/seaside/issues/list .

Cheers,

Julian

On Sun, Jan 31, 2010 at 9:14 AM, Bart Gauquie <bart.gauquie at gmail.com>wrote:

> Dear all,
>
> I'm creating a jquery plugin in seaside for jqgrid and trying out the json
> way of loading data. I've noticed following behaviour while trying to
> convert a Dictionary, Collection to a Json string.
>
> This is the expected result:
> {"page":"1",
>   "total":2,
>   "records":"13",
>    "rows":
>       [{"id":"1","cell":["1","2007-10-01","Client
> 1","100.00","20.00","120.00","note 1"]},
>     {"id":"3","cell":["3","2007-10-02","Client
> 2","300.00","60.00","360.00","note for invoice 3"]},
>     {"id":"2","cell":["2","2007-10-03","Client
> 1","200.00","40.00","240.00","note 2"]},
>     {"id":"4","cell":["4","2007-10-04","Client
> 3","150.00","0.00","150.00","no tax"]}]}
>
> I've created some classes to generate this structure automatically.
> JQRowContent with an id and a rows array.
>
> JQRowContent>>jsonOn: aStream
>
> (Dictionary newFrom: {'id'->id. 'cell'->columnValues}) jsonOn: aStream
>
> And the JQGridSearchResponse with a page, totalNumberOfPages,
> totalNumberOfRecords and rowContents:
>
> JQGridSearchResponse>>jsonOn: aStream
>
> (Dictionary newFrom:
>
> {'page'->page.
> 'total'->totalNumberOfPages.
> 'records'->totalNumberOfRecords.
> 'rows'->rowContents})
> jsonOn: aStream
>
>
> Writing out the response is then just:
>
> searchResponse jsonOn: response stream
>
> However, out of the box, using Seaside 3.0 with Javascript-Core-lr.74 it
> does not work as expected.
>
> I get the following result:
> '{"page":1,"total":1,"rows":[a JQGridRowContent,a JQGridRowContent,a
> JQGridRowContent,a JQGridRowContent,a JQGridRowContent],"records":100000}'
>
> Meaning that the collection of rowContents of the dictionary did not get
> json encoded recursively. Is this the normal behaviour? If I look at
> JSStream>>encodeKey: aKey value: aValue on: aStream
>
> self encodeKey: aKey on: aStream.
> aStream nextPut: $:; javascript:aValue
>
>
> You see that the value (rowcontents array) gets encoded as plain javascript
> and not as json.
> Overriding this method in JSJsonStream (which was used) :
> JSJsonStream>>encodeKey: aKey value: aValue on: aStream
>
> self encodeKey: aKey on: aStream.
> aStream nextPut: $:.
> aValue jsonOn: aStream.
>
> and also overriding:
>
> JSJsonStream>>encodeCollection: aCollection on: aStream
>
> aStream nextPut: $[.
> aCollection
>
> do: [:each|each jsonOn: aStream]
> separatedBy: [aStream nextPut: $,].
>
> aStream nextPut: $]
>
>
> gives the correct result.
>
> The above code should get further refactored (2 much duplication) by
> extracting in JSStream a method to encode a value:
>
> JSStream>>encodeValue: aValue on: aStream
>
> aStream javascript: aValue
>
> using this method in #encodeCollection on:, #encodeKey: value: on:, and
> others from JSStream.
>
> and off course overriding this in JSJsonStream.
> JSJsonStream>>encodeValue: aValue on: aStream
>
> aValue jsonOn: aStream
>
>
> (and maybe adding
> Stream>>json: anObject
>
> anObject jsonOn: self)
>
> Is the behaviour I'm experiencing a known issue? Or is there a reason it is
> designed this way? I've searched the mailing/bug list but could not find
> anything.
>
> Thanks for any help.
>
> Kind Regards,
>
> Bart
>
>
>
>
>
>
>
>
>
> --
> imagination is more important than knowledge - Albert Einstein
> Logic will get you from A to B. Imagination will take you everywhere -
> Albert Einstein
> Learn from yesterday, live for today, hope for tomorrow. The important
> thing is not to stop questioning. - Albert Einstein
> The true sign of intelligence is not knowledge but imagination. - Albert
> Einstein
> However beautiful the strategy, you should occasionally look at the
> results. - Sir Winston Churchill
> It's not enough that we do our best; sometimes we have to do what's
> required. - Sir Winston Churchill
>
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/seaside/attachments/20100131/53e3f1a5/attachment-0001.htm


More information about the seaside mailing list