2017-03-15 4 views

답변

6

를의를 사용 json:transform-to-json 전화는 MarkLogic에서 제공합니다.

import module namespace json = "http://marklogic.com/xdmp/json" 
    at "/MarkLogic/json/json.xqy"; 

json:transform-to-json(
    <json type="array" xmlns="http://marklogic.com/xdmp/json/basic">{ 
    for $row in /md:row 
    let $test := $row/md:test/text() 
    return (
     <json type="object"> 
     <test type="object"> 
      <type type="string">test</type> 
      <test type="array"> 
      <item type="string">{$test}</item> <!-- testa and testb were undefined --> 
      <item type="string">{$test}</item> 
      </test> 
     </test> 
     </json> 
    ) 
    }</json> 
) 

문제 중이 방지 :

  • 당신은 모든에서 구문 쉼표 을 추가 할 필요가 없습니다 - 그들이 완전히 transform-to-json 호출에 의해 생성하고, 그 전체를 mooting 일련의 문제.
  • 부주의 한 형식의 출력 (XML 텍스트 노드에 JSON에서 유효하도록 이스케이프해야하는 문자가 포함되어있는 경우 - 예를 들어 줄 바꿈에 해당).
  • 주사 공격 ($testa 또는 $testbtest", "hello", "world", "foo이 포함되어있는 경우 JSON 코드에 별도의 요소가 추가되므로 더 공격적으로 공격하여 구조를 벗어나 외부 목록에 완전히 새로운 사전을 추가 할 수 있습니다.
+0

문제에 대해 알려 주셔서 감사합니다. – Jon

2

대신 마지막 요소를 감지하고 루프에서이 문제를 처리, 자동으로 당신이 원하는 무엇을 string-join, 사용하여 출력 JSON이다 주어진 상황에서

string-join(
    for $row in /md:row 
    let $test := $row/md:test/text() 
    let $last := $row/*[fn:position() = fn:last()] 
    return (
    '{ 
    "test": { 
    "type": "test", 
    "test": [',$testa,',',$testb,'] 
    }, 
", ") 
+1

충분히 공정하지만, (문자열 연결을 통해 JSON을 생성하는) * 매우 * 나쁜 습관 (쉽게 주입 공격, 잘못된 형식의 출력 등이 발생하기 쉽습니다)이라고 부릅니다. 문자열을 연결하여 XML을 생성하는 사람들을 싫어하는 것처럼 JSON을 이와 같이 생성하면 비슷한 함정을 갖게됩니다. 다른 방법으로 https://docs.marklogic.com/json:transform-to-json을 참조하십시오. –

+1

@CharlesDuffy MarkLogic 태그를 알지 못했습니다! 나는 이것이 권장되지 않는다는 것을 잘 알고 있으며 나는 집에서하지 않는다고 약속한다. – wst

+0

나쁜 습관으로 인해 대답이 업데이트되었다. 고맙습니다! – Jon

0

나는 완전히 찰스의 의견에 동의, 나는 WST의이보다 문자열이 조인 좋아하지만 완전성을 위해, 또한 FLWOR 식의 일부입니다 at 문이있다. 다음과 같이 사용할 수 있습니다.

let $rows := (1 to 10) 
    let $last := fn:count($rows) 
    for $row at $index in $rows 
    let $test := string($row) 

    return (
    '{ 
    "test": { 
    "type": "test", 
    "test": [',$test,'] 
    }  
    }', 
    if($index eq $last) 
    then '' 
    else (',') 
) 

HTH!