groovy 是否可以使用YamlSlurper和YamlBuilder查找重复的属性名称?

xxhby3vn  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(151)

如果我有一个像这样的yaml文件:

obj:
  - name: 'msg'
    patterns:
      '("ssn":")([^"]*)(")' : '$1xxxxxxxxx$3'
      '("cvv":")([^"]*)(")' : '$1xxxx$3'
      '("ssn":")([^"]*)(")' : '$1xxxxxxxxx$3'

如果我使用Groovy YamlSlurper类来加载它,“patterns”对象将有两个属性,名称如下:

  • (“ssn”:“)([^"]*)(“)
  • (“cvv”:“)([^"]*)(“)

输入中的第三个属性的名称与第一个属性的名称相同,因此第三个属性将覆盖第一个属性(反之亦然)。
有没有什么方法可以使用YamlSlurper和YamlBuilder的某种组合来检测输入是否具有重复的属性名称?
我可以看到,更改此文件的预期语法,使其预期格式如下:

obj:
  - name: 'msg'
    patterns:
      - '("ssn":")([^"]*)(")' : '$1xxxxxxxxx$3'
      - '("cvv":")([^"]*)(")' : '$1xxxx$3'
      - '("ssn":")([^"]*)(")' : '$1xxxxxxxxx$3'

如果我不能在使用原始格式的输入中检测到重复的属性名称,我会考虑更改规范以要求修改后的格式。

yftpprvb

yftpprvb1#

groovy.yaml.YamlSlurper后面有一个jackson库。
解析()-〉转换器()-〉jackson
因此,您可以使用它来检测第一个重复项:

import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.DeserializationFeature

String yaml = '''
obj:
  - name: 'msg'
    patterns:
      '("ssn":")([^"]*)(")' : '$1xxxxxxxxx$3'
      '("cvv":")([^"]*)(")' : '$1xxxx$3'
      '("ssn":")([^"]*)(")' : '$1xxxxxxxxx$3'
'''

def result =
    new ObjectMapper()
        .enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY)
        .readTree(new YAMLFactory().createParser(yaml))

此代码抛出异常:

com.fasterxml.jackson.databind.exc.MismatchedInputException: 
  Duplicate field '("ssn":")([^"]*)(")' for `ObjectNode`: 
  not allowed when `DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY` enabled
  at [Source: (StringReader); line: 7, column: 31]

相关问题