51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package service
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
)
|
||
|
||
// ExtractPaperIDFromTaskContent 从任务 content JSON 中解析试卷 ID(支持 exam_id/paper_id/examId/paperId,含数字)
|
||
func ExtractPaperIDFromTaskContent(content json.RawMessage) string {
|
||
if len(content) == 0 {
|
||
return ""
|
||
}
|
||
var m map[string]interface{}
|
||
if err := json.Unmarshal(content, &m); err != nil {
|
||
return ""
|
||
}
|
||
paperID := stringFromMap(m, "exam_id", "paper_id", "examId", "paperId")
|
||
if paperID != "" {
|
||
return paperID
|
||
}
|
||
if obj, ok := m["objective"].(map[string]interface{}); ok {
|
||
paperID = stringFromMap(obj, "exam_id", "paper_id", "examId", "paperId")
|
||
}
|
||
return paperID
|
||
}
|
||
|
||
func stringFromMap(m map[string]interface{}, keys ...string) string {
|
||
for _, k := range keys {
|
||
v, ok := m[k]
|
||
if !ok || v == nil {
|
||
continue
|
||
}
|
||
switch val := v.(type) {
|
||
case string:
|
||
if val != "" {
|
||
return val
|
||
}
|
||
case float64:
|
||
if val == float64(int64(val)) {
|
||
return fmt.Sprintf("%d", int64(val))
|
||
}
|
||
return fmt.Sprintf("%.0f", val)
|
||
case int:
|
||
return fmt.Sprintf("%d", val)
|
||
case int64:
|
||
return fmt.Sprintf("%d", val)
|
||
}
|
||
}
|
||
return ""
|
||
}
|