0

在我的任务中,我处理传入的 json 并使用 ResultSetReader 将数据作为数据集返回。所有类型都必须写入“类型”。它们现在定义如下:def types = list.find (). Values ​​() *. GetClass () *. SimpleName

但是这里有两个问题:

  1. 如果在 json 的第一个块中某个字段有“null”,而在下一个块中有一个数字,则类型写为“null”,而不是“Integer”。

  2. 如果在所有的json块中,某人的字段都是“null”,那么就写“null”,你需要默认写,比如“String”,这样程序就不会停止工作。

    我该怎么做?恳请您不要重写我所有的代码,而是专门针对这个问题提供建议。"Types" 应该只包含格式 ["String", "Integer", "String"] 的类型(例如)。

    无需告知类型将是 [NameJSON: String, NameJSON: Integer, NameJSON: Sting],因为在这种情况下我不能使用 ResultSetReader。

import groovy.json.JsonSlurper
import ru.itrpro.xm.plugins.groovy.ResultSetReader;

class XM_PARSE_XLS {

    def execute(ResultSetReader reader, String pfile) {

        def jsonSlurper = new JsonSlurper()
        def list = jsonSlurper.parseText pfile

        List names = list.inject( new LinkedHashSet<>() ){ res, map ->
            res.addAll map.keySet()
            res
        }.toList()
        def types = list.find().values()*.getClass()*.simpleName

        //formation of the dataset header
        reader.outputLinesSetHeaders(names,types);

        list.each{ e ->
            reader.outputLines names.collect{ e[ it ] }
            //println names.collect{ e[ it ] }
        }

        //closing dataset
        reader.outputLinesEnd();
        return null;

    }
    static void main(String... args) {
        String pfile =  """
[{"AUTO":"bmw",
  "HOME":null,
  "JOB":""},
  
  {"AUTO":"audi",
  "HOME":135,
  "JOB":null},
  
  {"AUTO":"opel1",
  "HOME":10,
  "JOB":null}]
"""
        def SSC = new XM_PARSE_XLS()
        def res = SSC.execute(new ResultSetReader(), pfile)
    }
}
4

1 回答 1

1

这里的工作示例。

考虑替换这个:

def types = list.find().values()*.getClass()*.simpleName

有了这个(编辑:更新了关于 BigDecimal/double 的评论中的问题):

// as requested in comments:
def getTypeDef(def value) {
    (value instanceof BigDecimal) ? "double" : value.getClass().simpleName
}

def typeMap = [:].withDefault { key -> "String" }
list.each { map ->
    map.each { key, value ->
        if (value != null) {
            typeMap[key] = getTypeDef(value)
        }   
    }   
}   
def types = names.collect { name -> typeMap[name] }

这个想法是 atypeMap将字段名称映射到它的类型,并且默认为String. 然后:

  • 遍历列表中的每个项目
  • 遍历项目中的每个字段
  • 如果该字段已定义,请使用其类型typeMap

如果任何项目具有适当的字段值,则将使用该值(假设项目不能具有不同类型的值)。如果没有项目具有该字段的值,则typeMap默认为String.

于 2020-11-13T18:43:44.360 回答