Here's a cleaned up version of your code, along with the note that in
my example xml, </a> should have been </ab>

OPEN    =: '{'
CLOSE    =: '}'
MID      =: ':'
COMMA    =: ','
QUOTE    =: '"'
LISTOPEN         =: '['
LISTCLOSE =: ']'

NB. to JSON string (double quote)
str =: (,&QUOTE)@:(QUOTE&,)@:":

NB. serialize box tree to JSON
toJSON =: verb define
  if. ((<datatype y) = <'boxed') = 0 do.
    result =: str y
  else.
    isList =. 0
    NB. left side
    left =. >@:(0&{) y
    if. (< datatype left) = <'boxed' do.
      isList =. 1
      left =. toJSON left
    else.
      left =. OPEN , str left
    end.
    NB.right side
    right =. (1&{) y
    if. (< datatype right) = <'boxed' do.
      right =. toJSON > right
    else.
      right =. (": right)
      NB. literal for all
    end.
    result =: left , MID , right
    if. isList = 0 do.
      result =: left , MID , right , CLOSE
    else.
      result =: LISTOPEN , left , COMMA , right , LISTCLOSE
    end.
  end.
  result
)

data =: 'level1';(<('level2a';'data data
data');<('level2b';<('level3';'more data data')))
expect=: '{"level1":[{"level2a":"data data
data"},{"level2b":{"level3":"more data data"}}]}'
assert expect -: toJSON data


Beware of potential line wrap near then end, there...

Thanks,

-- 
Raul

On Fri, Dec 5, 2014 at 7:50 PM, Jon Hough <[email protected]> wrote:
> Sorry, My code got mangled again. (I am still not sure why - I may just 
> change to a non outlook.com email address)
> OPEN    =: '{'
> CLOSE   =: '}'
> MID     =: ':'
> COMMA   =: ','
> QUOTE   =: '"'
> LISTOPEN        =: '['
> LISTCLOSE =: ']'
>
> NB. to JSON string (double quote)
> str =: (,&QUOTE)@:(QUOTE&,)@:":
>
> NB. serialize box tree to JSON
> toJSON =: verb define
> if. ((<datatype y) = <'boxed') = 0 do.
> result =: str y
> else.
> isList =. 0
> NB. left side
> left =. >@:(0&{) y
> if. (< datatype left) = <'boxed' do.
>         isList =. 1
>         left =. toJSON left
> else.
>         left =. OPEN , str left
> end.
> NB.right side
> right =. (1&{) y
> if. (< datatype right) = <'boxed' do.
>         right =. toJSON > right
> else.
>         right =. (": right) NB. literal for all
> end.
> result =: left , MID , right
> if. isList = 0 do.
>         result =: left , MID , right , CLOSE
> else.
>         result =: LISTOPEN , left , COMMA , right , LISTCLOSE   end.
> end.
> result
> )
>> From: [email protected]
>> To: [email protected]
>> Date: Sat, 6 Dec 2014 00:47:26 +0000
>> Subject: Re: [Jprogramming] xml in J
>>
>> A box tree seems to be the best fit, since XML is a tree anyway.I actually 
>> attempted a JSON serializer/deserializer in J. I got the serialization part 
>> (the easy part) done,but not tested and I lost interest.Of course XML is a 
>> little different to JSON (e.g. attributes) and JSON is much easier.Anyway 
>> this is my serialization code, which may be helpful in some way:
>> OPEN  =: '{' CLOSE    =: '}' MID      =: ':' COMMA    =: ',' QUOTE    =: '"' 
>> LISTOPEN         =: '[' LISTCLOSE =: ']'
>> NB. to JSON string (double quote)str =: (,&QUOTE)@:(QUOTE&,)@:":
>> NB. serialize box tree to JSONtoJSON =: verb defineif. ((<datatype y) = 
>> <'boxed') = 0 do.result =: str yelse.isList =. 0NB. left sideleft =. 
>> >@:(0&{) yif. (< datatype left) = <'boxed' do.   isList =. 1     left =. 
>> toJSON leftelse.        left =. OPEN , str leftend.NB.right sideright =. 
>> (1&{) yif. (< datatype right) = <'boxed' do.   right =. toJSON > rightelse.  
>>   right =. (": right) NB. literal for all end.
>> result =: left , MID , rightif. isList = 0 do.        result =: left , MID , 
>> right , CLOSEelse.       result =: LISTOPEN , left , COMMA , right , 
>> LISTCLOSE   end.end.result)
>> Some data:
>> data =: 'level1';(<('level2a';'data data data');<('level2b';<('level3';'more 
>> data data')))
>>
>>
>> My example data is trying to be equivalent to Dictionary<string, object> 
>> structures, as in C#.
>> i.e. inside left box is a string, and inside right box is an object, in the 
>> above case, string data, and in the case of
>> level2a and level2b - a list of data.
>>
>>
>>
>> > From: [email protected]
>> > Date: Fri, 5 Dec 2014 16:27:41 -0500
>> > To: [email protected]
>> > Subject: [Jprogramming] xml in J
>> >
>> > I would like to revisit the idea of using J to parse xml.
>> >
>> > The xml/sax addon was a nice idea, but not very stable. It represented
>> > xml as a series of events (function calls), and left it up to the user
>> > how they would structure the result. Unfortunately, it also rather
>> > reliably crashes J.
>> >
>> > This can be mitigated in various ways. If what you are parsing is
>> > simple enough, and you can live with 32 bit j602, xml/sax can work
>> > great. But those are not always ideal constraints to work with.
>> >
>> > But... what's a good data structure in J, to represent xml?
>> >
>> > A problem is that xml is something of a living example of "the nice
>> > thing about standards is that there are so many to choose from". The
>> > standards documents describing xml are voluminous, and there are many
>> > alternatives which are physically different but logically similar to
>> > wade through.
>> >
>> > Still, at a basic level, xml is something of a nested sequence type of
>> > a thing. So one approach might leverage boxed character arrays. This
>> > will not be particularly efficient, but it's a start.
>> >
>> > For example, this xml snippet:
>> >
>> > <ab cd="ef" gh="ijk">lmnop</a>
>> >
>> > Might be represented in J as:
>> >    'ab';<('cd';'ef'),('gh';'ijk'),:'';<<'lmnop'
>> >
>> > (The extra boxing on the text is because that might in the general
>> > case actually be a sequence of elements).
>> >
>> > Another approach might be:
>> >    'ab';(('cd';'ef'),:('gh';'ijk'));<<'lmnop'
>> >
>> > Here, the [textual, in this case] content of the element is stored in
>> > a separate box from the attributes, instead of treating it as a
>> > blank-named attribute.
>> >
>> > But perhaps there are good non-boxed ways of representing the structure?
>> >
>> > Has anyone else been working with xml in J?
>> >
>> > Thanks,
>> >
>> > --
>> > Raul
>> > ----------------------------------------------------------------------
>> > For information about J forums see http://www.jsoftware.com/forums.htm
>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to