Groovy: Создать объект для добавления в LinkedHasMap - PullRequest
0 голосов
/ 28 мая 2020

Я новичок в Groovy и Java. У меня есть функция, которая возвращает LinkedHashMap из некоторого объекта. Это работает:

def get_map(Node) {
    nodeRootName = Node.name() 
    if (Node.childNodes().size() == 0) {
        return [(nodeRootName): (Node.text())]
    } else {
        subMap = [(nodeRootName):[]]
        for (subNode in Node.childNodes()) {
            if (subNode.name() != "cryptoSigns") {
                subMap.(subMap.keySet()[0]).add(get_map(subNode))
            }    
        }
        return subMap
    }
}

Вызов этой функции в коде:

    nodeMap = [(rootNodeName): [data:[]]] 
    for (subNode in node.childNodes()[0].childNodes()) {
            nodeMap.position.data.add(get_map(subNode))
        }
    } 

Массив [data:[]] LinkedHashMap сформирован.

Теперь мне нужно из массива сделать один LinkedHasMap. Я пытаюсь сделать одну карту в своей функции. Это может быть одна карта или массив карт с ключом. Например:

[data:[
 key1: value,
 key2:[
   [key: value],
   [key: [
    [key: value],
    [key: value]
   ]
 ]
]]

Я пробую:

def get_map(Node) {
    nodeRootName = Node.name() 
    if (Node.childNodes().size() == 0) {
        Map map = new HashMap()
        map.put((nodeRootName), (Node.text()))
        return map
    } else {
        Map subMap = new HashMap()
        for (subNode in Node.childNodes()) {
            subMap.put((nodeRootName), (get_map(subNode)))    
        }
        return subMap
    }
}

Функция вызова:

 Map nodeMap = new HashMap()
 Map data = new HashMap()
 for (subNode in node.childNodes()[0].childNodes()) {
      data.put(get_map(subNode))
      nodeMap.put((rootNodeName): (data))
 }  
 jsonObject.nsiKTRUs.add(nodeMap)  

Но у меня есть ошибка: groovy .lang. MissingMethodException: нет сигнатуры метода: java .util.HashMap.put () применимо для типов аргументов: (HashMap) значения: [[code: 01.11.11.111-00001]] at data.put(get_map(subNode))

Как правильно добавить мои значения на карту? Мои входные данные:

<xml>
 <data>
   <key>value</key>
     <key2>
       <key21>value</key>
       <key22>value</key>
       <key23>
         <key231>value</key>
       </key>
    </key2>
 </data>
<xml>

Пользовательское встраивание.

Требуется вывод

[data:[
    key: value, 
    key2:[
        key21: value, 
        key22: value, 
        key23:[
          key231: value
        ]
     ]
 ]
]

, а выходные данные необходимо добавить в другую LinkedHashMap

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Мне понравилось nodeMap[(rootNodeName)] << data

0 голосов
/ 29 мая 2020

Я бы сказал примерно так:

import groovy.util.*
import groovy.json.*


def text = '''<xml>
<data>
  <key>value1</key>
    <key2>
      <key21>value21</key21>
      <key22>value22</key22>
      <key23>
        <key231>value</key231>
      </key23>
   </key2>
</data>
</xml>'''

def xml = new XmlParser().parseText( text )

def handle
handle = { node ->
  if( node in String )
    node
  else{
    def val = node.collect handle
    [ (node.name()):1 == val.size() ? val.first() : val.collectEntries{ it } ]
  }
}

def map = xml.collect handle

// this line is needed for pretty print only
JsonOutput.prettyPrint JsonOutput.toJson( map )

выходы:

[
    {
        "data": {
            "key": "value1",
            "key2": {
                "key21": "value21",
                "key22": "value22",
                "key23": {
                    "key231": "value"
                }
            }
        }
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...