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

Bart Gauquie bart.gauquie at gmail.com
Sun Jan 31 17:14:34 UTC 2010


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/seaside/attachments/20100131/8cd6a870/attachment.htm


More information about the seaside mailing list