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