diff --git a/tool/json2go/parser.go b/tool/json2go/parser.go index 6fc7f90..61918d5 100644 --- a/tool/json2go/parser.go +++ b/tool/json2go/parser.go @@ -33,7 +33,6 @@ func NewJSON2GO(name string) *JSON2GO { } return &JSON2GO{ structName: name, - result: "type " + name + " struct { \n", } } @@ -58,11 +57,13 @@ func (jg *JSON2GO) Parse(inputJSON string) (string, error) { } parseResult := gjson.Parse(inputJSON) if parseResult.IsArray() { + jg.append("type " + jg.structName + " [] \n") jg.parseArray("", parseResult) } else { + jg.append("type " + jg.structName + " struct { \n") jg.parseObject("", parseResult) } - jg.result += "}" + jg.append("}") return jg.result, nil } @@ -71,17 +72,30 @@ func (jg *JSON2GO) Parse(inputJSON string) (string, error) { // Author : go_developer@163.com<白茶清欢> // // Date : 4:37 下午 2021/11/9 -func (jg *JSON2GO) parseArray(key string, parseResult gjson.Result) string { - for _, v := range parseResult.Array() { - if v.IsObject() { - jg.parseObject(key, v) - } else if v.IsArray() { - jg.parseArray("", v) - } else { - jg.result += util.SnakeCaseToCamel(key) + " " + v.Type.String() + " `json:\"" + key + "\"`" +func (jg *JSON2GO) parseArray(key string, parseResult gjson.Result) { + // 先遍历一遍确认所有数据类型都相同 + dataType := "" + for _, item := range parseResult.Array() { + if len(dataType) == 0 { + dataType = jg.getDataType(item) + continue + } + if jg.getDataType(item) != dataType { + // 不是所有数据类型都一致 + if len(key) == 0 { + jg.result += "interface{}" + return + } + jg.append(jg.buildField("[]interface{}", key)) + return } } - return "" + // 所有数据类型都一致 + if len(key) == 0 { + jg.append("[]" + dataType) + } else { + jg.append(jg.buildField("[]"+dataType, key)) + } } // parseObject 解析object @@ -99,11 +113,11 @@ func (jg *JSON2GO) parseObject(key string, parseResult gjson.Result) string { } else if v.IsArray() { jg.parseArray(k, v) } else { - jg.result += util.SnakeCaseToCamel(k) + " " + jg.getDataType(v) + " `json:\"" + k + "\"`\n" + jg.append(jg.buildField(jg.getDataType(v), k)) } } if len(key) > 0 { - jg.result += " } `json:\"" + key + "\"`\n" + jg.append(" } `json:\"" + key + "\"`\n") } return "" } @@ -129,7 +143,27 @@ func (jg *JSON2GO) getDataType(val gjson.Result) string { return "float64" } return "int64" + case gjson.JSON: + return "object" default: return "interface{}" } } + +// buildField 构建字段 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 9:20 下午 2021/11/9 +func (jq *JSON2GO) buildField(fieldType string, jsonTag string) string { + return util.SnakeCaseToCamel(jsonTag) + " " + fieldType + " `json:\"" + jsonTag + "\"`\n" +} + +// append 构建result +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 9:19 下午 2021/11/9 +func (jq *JSON2GO) append(appendStr string) { + jq.result += appendStr +}