【问题标题】:Groovy Convert string data to mapGroovy 将字符串数据转换为映射
【发布时间】:2020-02-21 22:04:27
【问题描述】:

我有一个大字符串,我想将其转换为 groovy 中的 Map。

字符串数据是一个键值对数组,每个键和值都括在方括号 [] 中并用逗号分隔。完整的数据字符串在这里:https://pastebin.com/raw/4rBWRzMs

某些值可以为空,例如'[]' 或包含 , 和 : 字符的值列表,例如 [1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358]

如果这些字符括在方括号 [] 中,我只想拆分它们。

我尝试过的代码在有值列表时会中断。有没有更好的办法?谢谢。

String testData="[[DEVICE_PROVISIONED]: [1], [aaudio.hw_burst_min_usec]: [2000],[debug.hwui.use_buffer_age]: [false], [ro.boot.boottime][1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358], ro.boot.hardware]: [walleye],[dev.mnt.blk.postinstall]: [],[ro.boot.usbradioflag]: [0],                                                                                        [ro.boot.vbmeta.avb_version]: [1.0], [ro.boot.vbmeta.device]: [/dev/sda18], [ro.boot.vbmeta.device_state]: [unlocked]]"

def map = [:]

testData.replaceAll('\\[]','null').replaceAll("\\s","").replaceAll('\\[','').replaceAll(']','').split(",").each {param ->
    def nameAndValue = param.split(":")
    map[nameAndValue[0]] = nameAndValue[1]
}

【问题讨论】:

  • 你可能需要为此编写一个解析器
  • 除了第一个 "[" 和最后一个 "]" 之外是否还有嵌套括号,或者数据是否仅包含简单的 [key]: [value] 对?键和/或值中是否有方括号,必须以某种方式转义?顺便说一句,您的testData 字符串似乎在语法上无效(例如,在[ro.boot.boottime] 之后缺少":",在ro.boot.hardware 之前缺少"[")。将字符串分成多行有助于阅读。

标签: arrays string groovy key-value


【解决方案1】:

我会从该格式中 grep 键值元组并从 那里。完成后,更容易进一步处理 转变。例如

def testData="[DEVICE_PROVISIONED]: [1], [aaudio.hw_burst_min_usec]: [2000],[debug.hwui.use_buffer_age]: [false], [ro.boot.boottime]: [1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358], [ro.boot.hardware]: [walleye],[dev.mnt.blk.postinstall]: [],[ro.boot.usbradioflag]: [0], [ro.boot.vbmeta.avb_version]: [1.0], [ro.boot.vbmeta.device]: [/dev/sda18], [ro.boot.vbmeta.device_state]: [unlocked]"

def map = [:]
(testData =~ /\s*\[(.*?)\]\s*:\s*\[(.*?)\]\s*,?\s*/).findAll{ _, k, v ->
    map.put(k,v)
}

println map.inspect()
// → ['DEVICE_PROVISIONED':'1', 'aaudio.hw_burst_min_usec':'2000', 'debug.hwui.use_buffer_age':'false', 'ro.boot.boottime':'1BLL:220,1BLE:641,2BLL:871,2BLE:475,SW:10029,KL:0,KD:78,ODT:148,AVB:358', 'ro.boot.hardware':'walleye', 'dev.mnt.blk.postinstall':'', 'ro.boot.usbradioflag':'0', 'ro.boot.vbmeta.avb_version':'1.0', 'ro.boot.vbmeta.device':'/dev/sda18', 'ro.boot.vbmeta.device_state':'unlocked']

请注意,我已经修复了 testData 中的一些语法并删除了外部 []。如果原始 testData 实际上包含无效语法 按照给定的规则,那么这将不起作用。

【讨论】:

  • 完美运行!即使对于完整的链接数据集。如果您能解释您使用的正则表达式,我将不胜感激?非常感谢
  • 正则表达式查找[key]: [value]
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 2016-04-17
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多