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)
|
||
}
|