Marklogic 未看到json:transform-from-json和fn:tokenize的预期输出

Marklogic 未看到json:transform-from-json和fn:tokenize的预期输出,marklogic,Marklogic,我们有两个REST扩展。两者都希望从客户端获得CSV数据。我们通过json传递完全相同的数据。传入的消息是相同的,我们在服务器上对接收到的json消息执行xdmp:log($input),相同: 2014-08-28 12:06:13.443 Info: STRLF3: START VERTALER ++++++++++++++++++++++++++++++++++++ 2014-08-28 12:06:13.443 Info: STRLF3: {"ID":"","DingenID":"","

我们有两个REST扩展。两者都希望从客户端获得CSV数据。我们通过json传递完全相同的数据。传入的消息是相同的,我们在服务器上对接收到的json消息执行
xdmp:log($input)
,相同:

2014-08-28 12:06:13.443 Info: STRLF3: START VERTALER ++++++++++++++++++++++++++++++++++++
2014-08-28 12:06:13.443 Info: STRLF3: {"ID":"","DingenID":"","VertaalType":"VAN6NAARWIJK","Name":"Vertaling-28-Aug-2014 12:08.txt","Text":"PC,Verkoopprijs\n1000AK,89.99\n1000EA,49.99\n1001GM,100\n1001LA,34.99\n1001MJ,24.99\n1011AC,19.98\n1011AC,20.99\n1011AC,9.98\n1011AC,30.98\n1011BT,999.01\n1011CD,30\n1011DJ,12\n1011DJ,100.98\n1011DJ,99.98\n1011DJ,24.99\n1011DK,18.98\n1011EG,28.98\n1011EK,93.97\n1011EK,50.99\n1011ET,51.49\n1011EZ,51.99\n1011GA,24.99\n1011GD,34.99\n1011GR,35.99\n1011GW,29.99\n1011GW,24.99\n1011HB,14.98\n1011HB,29.99\n1011HB,65.45\n1011HB,28.79\n1011HL,49.99\n1011JH,18.98\n1011JH,19.99\n1011JH,14.98\n1011JX,70\n1011KC,54.98\n1011KK,100\n1011KX,43.98\n1011LE,119\n1011LL,49.99\n1011LL,4.99\n1011LM,64.99\n1011LM,39.95\n1011LS,13.97\n1011LX,20\n1011LZ,29.99\n1011LZ,16.99\n1011MG,49.99\n1011MH,100\n1011MH,79.99\n1011MH,72\n1011MK,31.99\n1011ML,48.98\n1011ML,24.99\n1011ML,83.97\n1011MN,23.98\n1011MN,35.97\n1011MR,30.99\n1011NA,19.8\n1011NC,24.99\n1011NK,73.98\n1011NV,12\n1011NV,19.99\n1011NV,19.99\n1011NV,9.98\n1011NV,4.99\n1011NV,12\n1011PG,50\n1011PG,39.98\n1011PG,24.99\n1011PL,35\n1011PL,366.01\n1011RH,23.99\n1011SG,8.98\n1011SG,10\n1011SP,50.99\n1011SZ,73.98\n1011TB,59.99\n1011TB,49.99\n1011TE,253.01\n1011TE,23.88\n1011TE,9.08\n1011TL,28\n1011TL,9.98\n1011TR,14.99\n1011TR,14.98\n1011TR,13.98\n1011TZ,33.97\n1011VB,220\n1011VZ,38.97\n1011WD,13.97\n1012AC,66.97\n1012AE,15.98\n1012AL,43.98\n1012AL,50.99\n1012BA,19.99\n1012BE,59.99\n1012BJ,29.99\n1012BJ,33.99"}
来自API2调用的日志消息:

2014-08-28 12:07:42.264 Info: STRLF3: ++++++++++++++++++ START TRANSACTIONS ++++++++++++++++++++++++++++++++++++
2014-08-28 12:07:42.264 Info: STRLF3: {"ID":"","DingenID":"","ProjectID":268393,"Name":"Transactiedata-28-Aug-2014 12:08.txt","Text":"PC,Verkoopprijs\n1000AK,89.99\n1000EA,49.99\n1001GM,100\n1001LA,34.99\n1001MJ,24.99\n1011AC,19.98\n1011AC,20.99\n1011AC,9.98\n1011AC,30.98\n1011BT,999.01\n1011CD,30\n1011DJ,12\n1011DJ,100.98\n1011DJ,99.98\n1011DJ,24.99\n1011DK,18.98\n1011EG,28.98\n1011EK,93.97\n1011EK,50.99\n1011ET,51.49\n1011EZ,51.99\n1011GA,24.99\n1011GD,34.99\n1011GR,35.99\n1011GW,29.99\n1011GW,24.99\n1011HB,14.98\n1011HB,29.99\n1011HB,65.45\n1011HB,28.79\n1011HL,49.99\n1011JH,18.98\n1011JH,19.99\n1011JH,14.98\n1011JX,70\n1011KC,54.98\n1011KK,100\n1011KX,43.98\n1011LE,119\n1011LL,49.99\n1011LL,4.99\n1011LM,64.99\n1011LM,39.95\n1011LS,13.97\n1011LX,20\n1011LZ,29.99\n1011LZ,16.99\n1011MG,49.99\n1011MH,100\n1011MH,79.99\n1011MH,72\n1011MK,31.99\n1011ML,48.98\n1011ML,24.99\n1011ML,83.97\n1011MN,23.98\n1011MN,35.97\n1011MR,30.99\n1011NA,19.8\n1011NC,24.99\n1011NK,73.98\n1011NV,12\n1011NV,19.99\n1011NV,19.99\n1011NV,9.98\n1011NV,4.99\n1011NV,12\n1011PG,50\n1011PG,39.98\n1011PG,24.99\n1011PL,35\n1011PL,366.01\n1011RH,23.99\n1011SG,8.98\n1011SG,10\n1011SP,50.99\n1011SZ,73.98\n1011TB,59.99\n1011TB,49.99\n1011TE,253.01\n1011TE,23.88\n1011TE,9.08\n1011TL,28\n1011TL,9.98\n1011TR,14.99\n1011TR,14.98\n1011TR,13.98\n1011TZ,33.97\n1011VB,220\n1011VZ,38.97\n1011WD,13.97\n1012AC,66.97\n1012AE,15.98\n1012AL,43.98\n1012AL,50.99\n1012BA,19.99\n1012BE,59.99\n1012BJ,29.99\n1012BJ,33.99"}
然后我们进入代码的这一部分:

在API 1中,我们有:

        let $_ := xdmp:log("START VERTALER ++++++++++++++++++++++++++++++++++++")
        let $_ := xdmp:log($input)

        let $id         := sl3:get-id("/app/vertaler/", "json")
        let $uri        := fn:concat("/app/vertaler/", $id, ".xml")
        let $xml        := json:transform-from-json($input)
        let $vertaaltype:= $xml//jbasic:VertaalType/text()
        let $fileID     := $xml//jbasic:ID/text()
              let $preurl     := 'http://streetlife.dikw.com'

        (: do vertaal magic here ... :)
        let $text := $xml//jbasic:Text/text()

        let $_ := xdmp:log(fn:concat("Recieved text data, raw: ", $input))
        let $codes := fn:tokenize($text,'\n')
        (: check if tokenization is ok :)
        let $_ := xdmp:log(fn:concat("Recieved text data, count: ", fn:count($codes)))
结果1:

2014-08-28 12:06:13.445 Info: STRLF3: Recieved text data, count: 100
我们看到文件被正确解析

在API 2中,我们有:

    let $project  := json:transform-from-json($input)/ns:ProjectID
    let $codes    := json:transform-from-json($input)/ns:Text
    let $_ := xdmp:log(fn:concat("123 Recieved text data, raw: ", $input))

    let $text     := fn:tokenize($codes,'
') (: 
 of '/n'  :)
    let $_ := xdmp:log(fn:concat("Recieved text data, count: ", fn:count($text)))
使用
\n
作为标记化字符的结果API 2:

2014-08-28 12:07:42.266 Info: STRLF3: Recieved text data, count: 1
API1需要fn:tokenize($text,'\n'),API2需要fn:tokenize($code,' ;')。额外的空间是有意的

json:transformfromjson
的预期结果是什么?API 1或2的行为,或者换句话说,我是否需要用
\n

标记?正如您所看到的,我在tokenize函数中有两个API,每个API都在工作,但不与另一个值一起工作


让我困惑的是,我已经逐行检查了,包括加载名称空间和模块,但仍然找不到区别。

如果在调用json:transform-from-json()时不提供配置,结果是“”名称空间中的XML

第一个示例将jsbasic前缀绑定到该名称空间,并使用子体XPath(“/”)提取属性

假设第二个示例将ns前缀绑定到…/json/basic名称空间,XPath将尝试匹配根位置的属性。无配置转换为json生成的XML中的根始终是“json”(带有名称空间),因此XPath不匹配。根据JSON的结构,可以使用子体XPath(“/”),如第一个示例所示

在第二个示例中,为了提高效率,您可能还希望在变量中捕获json:transform-from-json()的输出,如:

let $xml      := json:transform-from-json($input)
let $project  := $xml//ns:ProjectID
let $codes    := $xml//ns:Text
如果这不起作用,请尝试记录$xml以检查转换的输出

以下是文档:


    • 我怀疑这是换行转义的问题

      xdmp:to-json(
        'line 1
      line 2')
      
      => "line 1\nline 2"
      
      现在尝试添加
      tokenize

      xdmp:to-json(
        'line 1
      line 2')
      ! tokenize(., '\n')
      
      => "line 1\nline 2"
      
      这没有任何作用,因为
      tokenize
      将其第二个参数视为正则表达式。因此正则表达式
      \n
      匹配一个文字换行符,而输入中的换行符实际上是两个字符
      \
      n

      xdmp:to-json(
        'line 1
      line 2')
      ! tokenize(., '\\n')
      
      => "line 1
      line 2"
      

      这更接近我们想要的。我可能也不想在输出中使用双引号字符。但这只是为了说明换行符转义可能是个什么问题。

      我仍然不太明白问题是什么,但这对我来说适用于7.0-3:

      let $input := '{"ID":"","DingenID":"","ProjectID":268393,"Name":"Transactiedata-28-Aug-2014 12:08.txt","Text":"PC,Verkoopprijs\n1000AK,89.99\n1000EA,49.99\n1001GM,100\n1001LA,34.99\n1001MJ,24.99\n1011AC,19.98\n1011AC,20.99\n1011AC,9.98\n1011AC,30.98\n1011BT,999.01\n1011CD,30\n1011DJ,12\n1011DJ,100.98\n1011DJ,99.98\n1011DJ,24.99\n1011DK,18.98\n1011EG,28.98\n1011EK,93.97\n1011EK,50.99\n1011ET,51.49\n1011EZ,51.99\n1011GA,24.99\n1011GD,34.99\n1011GR,35.99\n1011GW,29.99\n1011GW,24.99\n1011HB,14.98\n1011HB,29.99\n1011HB,65.45\n1011HB,28.79\n1011HL,49.99\n1011JH,18.98\n1011JH,19.99\n1011JH,14.98\n1011JX,70\n1011KC,54.98\n1011KK,100\n1011KX,43.98\n1011LE,119\n1011LL,49.99\n1011LL,4.99\n1011LM,64.99\n1011LM,39.95\n1011LS,13.97\n1011LX,20\n1011LZ,29.99\n1011LZ,16.99\n1011MG,49.99\n1011MH,100\n1011MH,79.99\n1011MH,72\n1011MK,31.99\n1011ML,48.98\n1011ML,24.99\n1011ML,83.97\n1011MN,23.98\n1011MN,35.97\n1011MR,30.99\n1011NA,19.8\n1011NC,24.99\n1011NK,73.98\n1011NV,12\n1011NV,19.99\n1011NV,19.99\n1011NV,9.98\n1011NV,4.99\n1011NV,12\n1011PG,50\n1011PG,39.98\n1011PG,24.99\n1011PL,35\n1011PL,366.01\n1011RH,23.99\n1011SG,8.98\n1011SG,10\n1011SP,50.99\n1011SZ,73.98\n1011TB,59.99\n1011TB,49.99\n1011TE,253.01\n1011TE,23.88\n1011TE,9.08\n1011TL,28\n1011TL,9.98\n1011TR,14.99\n1011TR,14.98\n1011TR,13.98\n1011TZ,33.97\n1011VB,220\n1011VZ,38.97\n1011WD,13.97\n1012AC,66.97\n1012AE,15.98\n1012AL,43.98\n1012AL,50.99\n1012BA,19.99\n1012BE,59.99\n1012BJ,29.99\n1012BJ,33.99"}'
      let $m := xdmp:from-json($input)
      let $text as xs:string := map:get($m, 'Text')
      let $records := tokenize($text, '\n')
      let $labels := tokenize($records[1], ',')
      let $data := subsequence($records, 2)
      for $i in $data
      let $seq := tokenize($i, ',')
      return text { $labels[1], $seq[1], $labels[2], $seq[2] }
      
      我使用
      xdmp:fromjson
      来解析json,而不是
      json:transformfromjson
      。我不确定这是否与换行处理有什么不同,但它会返回一个json dictionary对象。这类似于map:map项,只是键是有序的

      无论如何,它返回:

      PC 1000AK Verkoopprijs 89.99
      PC 1000EA Verkoopprijs 49.99
      PC 1001GM Verkoopprijs 100
      PC 1001LA Verkoopprijs 34.99
      ...
      
      您还可以使用
      json:transformfromjson
      来实现这一点。将
      $m
      $text
      的赋值替换为:

      let $text as xs:string := json:transform-from-json($input)/xjb:Text
      

      和#10上标记对我来说同样适用于任何一个代码示例。

      谢谢您的回复,但示例显示我们发现文本没有问题。问题是当我们标记第一个需要/n第二个需要代码点(10)来标记。。。不知道为什么?添加“receivedtextdata,raw”日志消息,这样我们就可以看到需要标记化的文本。在上面的第一个和第二个代码块中,最后一行相当长…但仍然没有说明在一个api中的方式fn:tokenize($text,'\n')工作,而在另一个api中不。。。在这里,我需要fn:tokenize($code, ;'),以便标记器拆分>>相同的换行符表示形式,在默认设置中,json:transform-from-json()应该是什么?因此,这意味着换行符也被转换为HTML表示形式,即代码点(10)…请参见:
      json:transformfromJSON(“[”\n“])/*[1]!字符串到代码点(.)