This commit is contained in:
155
internal/shared/pdf/json_processor.go
Normal file
155
internal/shared/pdf/json_processor.go
Normal file
@@ -0,0 +1,155 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user