#json #marklogic
#json #marklogic
Вопрос:
Я новичок в json, поэтому мне нужна небольшая помощь, мне нужно получить значение json для каждого свойства, поэтому, когда я запустил приведенный ниже код, я получаю json в виде текста.
let $doc :=
for $sResult in ($result/search:result)
let $uri := fn:data($sResult/@uri)
let $docElements := $sResult/search:extracted
return xdmp:from-json-string($docElements/text())
return $doc
Вывод в текстовом формате:
[{"title":"xxxxxxxxx"}, {"species":"Animals"}]
[{"title":"yyyyyyyyy"}, {"species":"Animals"}]
Итак, я хочу получить что-то вроде $docElements/title/text()
, чтобы я получал значение свойства title json для выполнения некоторых строковых операций, а затем помещал их обратно в объект json для получения желаемого результата.
Итак, не уверен, как сделать то же самое.
Ответ №1:
Чтобы изменить содержимое документов, рассмотрите возможность использования search:resolve-nodes()
вместо search:search()
.
Если требуется получить и изменить содержимое JSON перед возвратом клиенту, один из подходов заключается в
- преобразуйте каждый узел JSON в изменяемую карту
- перейдите и измените карту с помощью map:get() и map:put()
- преобразуйте измененную карту обратно в узел JSON
Набросок этого подхода:
let $modifiedDocs :=
for $inputDoc in search:resolve-nodes(...query..)
let $tempMap := xdmp:from-json($inputDoc)
let $_ := ... navigate and modify the map ...
return xdmp:to-json($tempMap)
Для полноты картины, если целью было вместо этого изменить сохраненные документы JSON, итерация может напоминать следующий эскиз:
for $oldDoc in search:resolve-nodes(...query..)
let $tempMap := xdmp:from-json($inputDoc)
let $_ := ... navigate and modify the map ...
let $newDoc := xdmp:to-json($tempMap)
return xdmp:node-replace($oldDoc, $newDoc)
Надеюсь, это поможет,
Комментарии:
1. Спасибо за ответ, но мне нужно извлечь значения каждого свойства json, чтобы выделить текст поиска. Кроме того, мне не нужно ничего менять в документе, строковые изменения, которые я должен выполнить над текстом свойства json и отправить на уровень пользовательского интерфейса, никаких изменений в документах БД.
2. Пожалуйста, предложите.