Files
tyapi-server/internal/shared/pdf/json_processor.go
2025-12-03 12:03:42 +08:00

156 lines
4.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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