156 lines
4.4 KiB
Go
156 lines
4.4 KiB
Go
|
|
package pdf
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"encoding/json"
|
|||
|
|
"fmt"
|
|||
|
|
"regexp"
|
|||
|
|
"strings"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// JSONProcessor JSON处理器
|
|||
|
|
type JSONProcessor struct{}
|
|||
|
|
|
|||
|
|
// NewJSONProcessor 创建JSON处理器
|
|||
|
|
func NewJSONProcessor() *JSONProcessor {
|
|||
|
|
return &JSONProcessor{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// FormatJSON 格式化JSON字符串以便更好地显示
|
|||
|
|
func (jp *JSONProcessor) FormatJSON(jsonStr string) (string, error) {
|
|||
|
|
var jsonObj interface{}
|
|||
|
|
if err := json.Unmarshal([]byte(jsonStr), &jsonObj); err != nil {
|
|||
|
|
return jsonStr, err // 如果解析失败,返回原始字符串
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 重新格式化JSON,使用缩进
|
|||
|
|
formatted, err := json.MarshalIndent(jsonObj, "", " ")
|
|||
|
|
if err != nil {
|
|||
|
|
return jsonStr, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return string(formatted), nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ExtractJSON 从文本中提取JSON
|
|||
|
|
func (jp *JSONProcessor) ExtractJSON(text string) string {
|
|||
|
|
// 查找 ```json 代码块
|
|||
|
|
re := regexp.MustCompile("(?s)```json\\s*\n(.*?)\n```")
|
|||
|
|
matches := re.FindStringSubmatch(text)
|
|||
|
|
if len(matches) > 1 {
|
|||
|
|
return strings.TrimSpace(matches[1])
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 查找普通代码块
|
|||
|
|
re = regexp.MustCompile("(?s)```\\s*\n(.*?)\n```")
|
|||
|
|
matches = re.FindStringSubmatch(text)
|
|||
|
|
if len(matches) > 1 {
|
|||
|
|
content := strings.TrimSpace(matches[1])
|
|||
|
|
// 检查是否是JSON
|
|||
|
|
if strings.HasPrefix(content, "{") || strings.HasPrefix(content, "[") {
|
|||
|
|
return content
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GenerateJSONExample 从请求参数表格生成JSON示例
|
|||
|
|
func (jp *JSONProcessor) GenerateJSONExample(requestParams string, tableParser *TableParser) string {
|
|||
|
|
tableData := tableParser.ParseMarkdownTable(requestParams)
|
|||
|
|
if len(tableData) < 2 {
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 查找字段名列和类型列
|
|||
|
|
var fieldCol, typeCol int = -1, -1
|
|||
|
|
header := tableData[0]
|
|||
|
|
for i, h := range header {
|
|||
|
|
hLower := strings.ToLower(h)
|
|||
|
|
if strings.Contains(hLower, "字段") || strings.Contains(hLower, "参数") || strings.Contains(hLower, "field") {
|
|||
|
|
fieldCol = i
|
|||
|
|
}
|
|||
|
|
if strings.Contains(hLower, "类型") || strings.Contains(hLower, "type") {
|
|||
|
|
typeCol = i
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if fieldCol == -1 {
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成JSON结构
|
|||
|
|
jsonMap := make(map[string]interface{})
|
|||
|
|
for i := 1; i < len(tableData); i++ {
|
|||
|
|
row := tableData[i]
|
|||
|
|
if fieldCol >= len(row) {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
fieldName := strings.TrimSpace(row[fieldCol])
|
|||
|
|
if fieldName == "" {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 跳过表头行
|
|||
|
|
if strings.Contains(strings.ToLower(fieldName), "字段") || strings.Contains(strings.ToLower(fieldName), "参数") {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取类型
|
|||
|
|
fieldType := "string"
|
|||
|
|
if typeCol >= 0 && typeCol < len(row) {
|
|||
|
|
fieldType = strings.ToLower(strings.TrimSpace(row[typeCol]))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置示例值
|
|||
|
|
var value interface{}
|
|||
|
|
if strings.Contains(fieldType, "int") || strings.Contains(fieldType, "number") {
|
|||
|
|
value = 0
|
|||
|
|
} else if strings.Contains(fieldType, "bool") {
|
|||
|
|
value = true
|
|||
|
|
} else if strings.Contains(fieldType, "array") || strings.Contains(fieldType, "list") {
|
|||
|
|
value = []interface{}{}
|
|||
|
|
} else if strings.Contains(fieldType, "object") || strings.Contains(fieldType, "dict") {
|
|||
|
|
value = map[string]interface{}{}
|
|||
|
|
} else {
|
|||
|
|
// 根据字段名设置合理的示例值
|
|||
|
|
fieldLower := strings.ToLower(fieldName)
|
|||
|
|
if strings.Contains(fieldLower, "name") || strings.Contains(fieldName, "姓名") {
|
|||
|
|
value = "张三"
|
|||
|
|
} else if strings.Contains(fieldLower, "id_card") || strings.Contains(fieldLower, "idcard") || strings.Contains(fieldName, "身份证") {
|
|||
|
|
value = "110101199001011234"
|
|||
|
|
} else if strings.Contains(fieldLower, "phone") || strings.Contains(fieldLower, "mobile") || strings.Contains(fieldName, "手机") {
|
|||
|
|
value = "13800138000"
|
|||
|
|
} else if strings.Contains(fieldLower, "card") || strings.Contains(fieldName, "银行卡") {
|
|||
|
|
value = "6222021234567890123"
|
|||
|
|
} else {
|
|||
|
|
value = "string"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理嵌套字段(如 baseInfo.phone)
|
|||
|
|
if strings.Contains(fieldName, ".") {
|
|||
|
|
parts := strings.Split(fieldName, ".")
|
|||
|
|
current := jsonMap
|
|||
|
|
for j := 0; j < len(parts)-1; j++ {
|
|||
|
|
if _, ok := current[parts[j]].(map[string]interface{}); !ok {
|
|||
|
|
current[parts[j]] = make(map[string]interface{})
|
|||
|
|
}
|
|||
|
|
current = current[parts[j]].(map[string]interface{})
|
|||
|
|
}
|
|||
|
|
current[parts[len(parts)-1]] = value
|
|||
|
|
} else {
|
|||
|
|
jsonMap[fieldName] = value
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用encoding/json正确格式化JSON
|
|||
|
|
jsonBytes, err := json.MarshalIndent(jsonMap, "", " ")
|
|||
|
|
if err != nil {
|
|||
|
|
// 如果JSON序列化失败,返回简单的字符串表示
|
|||
|
|
return fmt.Sprintf("%v", jsonMap)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return string(jsonBytes)
|
|||
|
|
}
|