[squeak-dev] WebClient, Json and CouchDB

Igor Stasenko siguctua at gmail.com
Thu May 13 00:28:50 UTC 2010


Hannes, if you would be so kind, please merge your changes
with SCouchDB version of JSON
and save them in SCouchDB repository.

I will take a time to review them an fully integrate & fix all of the issues you
mentioned, including a proper utf-8 output encoding.

On 13 May 2010 03:16, Hannes Hirzel <hannes.hirzel at gmail.com> wrote:
> On 5/12/10, radoslav hodnicak <rh at 4096.sk> wrote:
>>
>>
>> On Wed, 12 May 2010, Hannes Hirzel wrote:
>>
>>> My question:
>>>
>>> Is there a nicer way of doing
>>>
>>> nnnn := ((c asciiValue bitAnd: 16rFFFF) printStringBase: 16) .
>>>                                              [nnnn size < 4] whileTrue: [nnnn := '0', nnnn].
>>>                              ^ '\u', nnnn
>>>
>>
>> Yes there is. As I said before, check the JSON package in the SCouchDB
>> repository (Igor's link from few days ago), where I fixed this bug. I'm
>> kinda surprised at your insistence to use a buggy/unmaintained JSON code
>> when you have been told several times there's one that's tested to work
>> with CouchDB (I use it in production).
>>
>> rado
>>
>>
>
>
>
> Hello Rado
>
> Yes, your version of the method is nicer
> escapeForCharacter: c
>
>        | index |
>        ^ (index := c asciiValue + 1) <= escapeArray size
>                ifTrue: [ ^ escapeArray at: index ]
>
>
>                "THIS IS WROOONG!!! unicode is not 16bit wide!"
>                ifFalse: [ ^ '\u', (((c asciiValue bitAnd: 16rFFFF) printStringBase:
> 16) padded: #left to: 4 with: $0) ]
>
> However your comment leads me to the non-urgent question: How would we
> deal with a code point >65536?
>
> Thank you for insisting that I check out your copy of the JSON package
> which you maintain in the SCouchDB project. The surprise on my side is
> that you went for creating a copy instead of putting your changes into
> the JSON project as it is open for everybody to write. Your copy is
> actually pretty hidden whereas the general JSON package is easy to
> find.
>
> I went through all the changes you and Igor did in the SCouchDB
> project and decided to fold part of them back to the JSON package
> http://www.squeaksource.org/JSON .
>
> I documented it on the wiki page which goes along with the JSON
> project. I copy it in below.***
>
>
> So the updated test case for working with WebClient, JSON and the
> couchDB is the following.
>
> |json couchDBurl |
>  json := JsonObject new.
>  json title: 'The title of my note card'.
>  json body: 'The body test text of my note card with some Unicode
> test characters ',
>                   (8450 asCharacter asString, 'ä.', Character cr).
>
> "Note: JsonObject behaves like a JavaScript object insofar that you
> can add properties to instances without the necessity that they have
> been declared as instance variables. But you might just as well use
> JsonObject like a Dictionary instead as it is a subclass of
> Dictionary."
>
> "create couchDB instance"
> couchDBurl := 'http://localhost:5984/notes'.
>
> WebClient httpPut: couchDBurl
>                 content: ''
>                 type: 'text/plain'.
>
> "Store first document"
> WebClient httpPut: couchDBurl, '/myNote1'
>                 content: json asJsonString
>                 type: 'text/plain'.
>
> "You get the document back with"
>
> WebClient httpGet: couchDBurl, '/myNote1' .
>
> So far so good. This solution however still escapes code points > 127.
> See a note on this below and more on this in an upcoming post.
>
> Regards
>
> Hannes
>
>
> ----------------------------------------------------------------------------------------------------------
>
> ***
> JSON-hjh.32
>
> Author: Hannes Hirzel
>
> Ancestors: JSON-rh.31
>
> In the project SCouchDB a copy of JSON is maintained by Igor Stasenko
> and Radoslav Hodnicak.
>
> This merges part of the changes back, in particular
>
> SCouchDB project
>
>    * JSON-Igor.Stasenko.28
>    * JSON-Igor.Stasenko.29
>    * JSON-rh.30
>    * JSON-rh.31
>
> Main changes
>
>   1. JsonObject is now a subclass of Dictionary instead of Object. So
> there is no need to implement the Dictionary interface.
>   2. Fix for converting Unicode characters to \uNNNN format (missing
> padding to 4 characters)
>
> No further changes
>
> The SCouchDB project contains more changes in the copy of the JSON package.
>
> I did not go further in merging because in SCouchDB / JSON-rh.32
> Radoslav Hodnicak introduces an instance variable 'converter'
>
> which is initialized to
>
>  converter := UTF8TextConverter new
>
> Igor Stasenko, Levente Uzonyi and Hannes Hirzel agreed that the UTF8
> conversion does not belong into the JSON package
>
> http://lists.squeakfoundation.org/pipermail/squeak-dev/2010-May/150497.html
>
> Levente Uzonyi:
>
> You only need to convert the characters to UTF-8, because you're
> sending them over the network to a server, and Unicode characters have
> to be converted to bytes someway. So the JSON printer shouldn't do any
> conversion by default except for escaping. The only problem is that
> escaping is not done as the spec requires it, but that's easy to fix.
>
> http://www.json.org/
>
> A string is a collection of zero or more Unicode characters, wrapped
> in double quotes, using backslash escapes. A character is represented
> as a single character string. A string is very much like a C or Java
> string.
> About escaping Unicode characters
>
> Actually escaping Unicode characters to
>
> \uNNNN
>
> is not necessary for characters with codes >127 in case of an upload
> to a CouchDB. But this version does it.
>
> In case you want to patch this change method
>
>  Json class escapeForCharacter: c
>
>



-- 
Best regards,
Igor Stasenko AKA sig.



More information about the Squeak-dev mailing list