Преобразовать большие значения XML в двойной тип JSON? - PullRequest
0 голосов
/ 27 мая 2019

Я формирую xml, фрагмент которого -

<cache-properties>
  <list-cache-hit-rate>
    <units>hits/sec</units>
    <value>1.5308452E6</value>
  </list-cache-hit-rate>
  <list-cache-miss-rate>
    <units>misses/sec</units>
    <value>25422.167</value>
  </list-cache-miss-rate>
  <compressed-tree-cache-hit-rate>
    <units>hits/sec</units>
    <value>970.2339</value>

Обратите внимание, что значение 1.5308452E6 достаточно велико, чтобы значения сохранялись как экспонента при выполнении fn:sum() за сценой.
Позже я конвертирую xml в json с помощью следующей функции -

let $arr := json:to-array(local:tojson($data))
return (($data))

, и преобразованное значение выглядит следующим образом -

cache-properties": {
  "list-cache-hit-rate": {
    "units": "hits/sec", 
    "value": 1.5308452E6
  }, 
  "list-cache-miss-rate": {
    "units": "misses/sec", 
    "value": "25422.167"
  }, 
  "compressed-tree-cache-hit-rate": {
    "units": "hits/sec", 
    "value": "970.2339"
  }, 

Обратите внимание, что значения заключены в кавычки, кроме 1.5308452E6 это значениеЭто не в кавычках.Какая коррекция здесь нужна?Или это правильно?Я предпочел бы иметь все значения в кавычках.Это моя пользовательская функция преобразования -

declare function local:tojson($func){
let $custom := let $config := json:config("custom")
                let $_ := map:put( $config, "whitespace", "ignore" )
                let $_ := map:put( $config, "array-element-names", "Video" )
                return $config
return json:transform-to-json($func,$custom)
};

1 Ответ

0 голосов
/ 27 мая 2019

Посмотрите на схему XML. Ваши фрагменты, похоже, похожи или идентичны XML-схеме статуса системы marklogic, однако вы упоминаете «fn: sum in the background», поэтому я предполагаю, что вы применили преобразование, которое изменило тип xsd. Код преобразования json использует тип XSD, если он находится в области действия, чтобы определить типизированный вывод в JSON (для числовых типов XML). Также, если число «слишком большое», оно может быть преобразовано в строку, чтобы избежать проблемы JavaScript.
(в основном он использует fn: data (value) для преобразования)

При необходимости вы можете либо принудительно применить строковый тип к своему xml, либо специализировать преобразование, переопределив один из примитивов json-custom: в json / custom.xqy, указав соответствующее сопоставление в конфигурации. Посмотрите в источнике полный список переопределяемых функций. Они не полностью документированы, поскольку не имеют в виду общую общность и могут быть неочевидными, простыми или, возможно, изменить поведение любым мыслимым образом.

Стратегии либо Используйте XML со схемой в области видимости, которая явно вводит атомарные значения (в вашем случае это xs: string), Переопределить одну из функций низкого уровня в custom.xqy Конвертируйте JSON с помощью пост-обработки и «зафиксируйте» нужные элементы Сверните свои собственные (не слишком сложно с демонстрацией образцов) Все вышеперечисленное

...