[MarkLogic Dev General] Constructing JSON objects

Will Thompson wthompson at jonesmcclure.com
Mon Mar 16 13:03:06 PDT 2015


In this case, json:object and json:array are fine - I just wanted nicer syntax so that, say, a recursive typeswitch to transform XML to JSON wouldn't turn into a mess with all the temp objects. I guess it's also probably nice for building arbitrary JSON if there is any nesting involved.

Mike - Right. And best-case scenario, if there is a conflict, I just remove the utility functions and everything works :)

-W


> On Mar 12, 2015, at 9:36 PM, David Lee <David.Lee at marklogic.com> wrote:
> 
> Making an XQuery function to call the explicit constructor with variable key names or number  of keys is not possible directly 
> There isn't the equivalent of map:entry , field names are constant expressions and the number of fields is constant, unlike element {}{}
> 
> You would have to resort to string conversions, in memory node operations or evals ...  Or stick with json:object() /json:array() 
> Or write it in Javascript 
> 
> In all cases what would the signature be?   A fundamental mismatch between XQuery an JSON is sequences vs arrays there are no vararg functions and any construct to nest or bound sequences involves a lot of syntax and temporary objects.
> 
> If you come up with something let us know!  
> 
> 
> 
> 
> 
> Sent from my iPad (excuse the terseness) 
> David A Lee
> dlee at marklogic.com
> 
> 
>> On Mar 12, 2015, at 9:51 PM, Michael Blakeley <mike at blakeley.com> wrote:
>> 
>> I tend to avoid declaring functions or variables in any namespace that I know other code is using. But you're doing it with your eyes open, and that's probably ok. Someday a server update may conflict. But if that happens, I'm sure you'll catch it in testing, and fix it before it breaks production.
>> 
>> Right?
>> 
>> -- Mike  
>> 
>>> On 12 Mar 2015, at 17:35 , Will Thompson <wthompson at jonesmcclure.com> wrote:
>>> 
>>> Thanks all. The ML8 constructors look very nice.
>>> 
>>> Mike - That's what I was looking for, thanks. I ended up writing something similar using json:array before I saw the reply, but I like your implementation better. Also, I appropriated the json: prefix because it looked nicer...for example, is there any reason why this would be bad (other than ML might decide implement it at some later date)? 
>>> 
>>> declare function json:new(...)
>>> 
>>> -W
>>> 
>>>> On Mar 12, 2015, at 4:38 PM, Sudhakar Reddy <Sudhakar.Reddy at marklogic.com> wrote:
>>>> 
>>>> You can also build using JSON node constructors available in ML 8
>>>> let $json-node := object-node { "id": number-node {12345},
>>>>               "a" : array-node {1,2,3} ,
>>>>               "b" : fn:true(),
>>>>               "c" : number-node {1234},
>>>>               "d" : array-node{
>>>>                       number-node {12345},
>>>>                       text {"test"},
>>>>                       boolean-node {fn:true()},
>>>>                       array-node {'aaa','bbb','ccc'}},
>>>>                       "e" : object-node { "x": "hello world",
>>>>                       "y": fn:false(),
>>>>                       "z" : array-node {1, 'a', fn:true()}
>>>>                       },
>>>>               "g": null-node {}
>>>>               }  
>>>>               return $json-node
>>>> 
>>>> Thanks
>>>> Sudhakar
>>>> 
>>>> 
>>>> 
>>>>> On 3/11/15, 6:52 PM, "Erik Hennum" <Erik.Hennum at marklogic.com> wrote:
>>>>> 
>>>>> Hi, Will:
>>>>> 
>>>>> You can use json:object() instead of map:map() for a mutable object where
>>>>> order is important.
>>>>> 
>>>>> I think the API is the same as that of map:map otherwise.
>>>>> 
>>>>> JSON nodes, like XML nodes, are immutable.
>>>>> 
>>>>> Erik Hennum
>>>>> 
>>>>> ________________________________________
>>>>> From: general-bounces at developer.marklogic.com
>>>>> [general-bounces at developer.marklogic.com] on behalf of Will Thompson
>>>>> [wthompson at jonesmcclure.com]
>>>>> Sent: Tuesday, March 10, 2015 5:09 PM
>>>>> To: MarkLogic Developer Discussion
>>>>> Subject: [MarkLogic Dev General] Constructing JSON objects
>>>>> 
>>>>> Is there a nice way to construct a JSON object similar to how maps can be
>>>>> constructed? Typically I would just do it this way:
>>>>> 
>>>>> xdmp:to-json(
>>>>> map:new((
>>>>> map:entry('x', 1),
>>>>> map:entry('y', 2)
>>>>> )))
>>>>> 
>>>>> Except that order is important in this specific scenario, and this ruins
>>>>> ordering.
>>>>> 
>>>>> -Will
>>>>> _______________________________________________
>>>>> General mailing list
>>>>> General at developer.marklogic.com
>>>>> http://developer.marklogic.com/mailman/listinfo/general
>>>>> _______________________________________________
>>>>> General mailing list
>>>>> General at developer.marklogic.com
>>>>> http://developer.marklogic.com/mailman/listinfo/general
>>>> 
>>>> _______________________________________________
>>>> General mailing list
>>>> General at developer.marklogic.com
>>>> http://developer.marklogic.com/mailman/listinfo/general
>>> 
>>> _______________________________________________
>>> General mailing list
>>> General at developer.marklogic.com
>>> http://developer.marklogic.com/mailman/listinfo/general
>> 
>> _______________________________________________
>> General mailing list
>> General at developer.marklogic.com
>> http://developer.marklogic.com/mailman/listinfo/general
> _______________________________________________
> General mailing list
> General at developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general



More information about the General mailing list