Golang解析数据时遇到的字符问题如何解决

Golang解析数据时遇到的字符问题如何解决 当主题包含类似""(反斜杠)的内容时,反序列化无法正确处理。如何解决这个问题?

谢谢

type Ticket struct {
	Requestor    string `json:"requestor"`
	Subject      string `json:"subject"`
	Text         string `json:"text"`
	TelefonicaID string `json:"telefonicaid"`
	Circuitid    string `json:"circuitid"`
}

err = json.Unmarshal(body, &t)

if err != nil {
    w.WriteHeader(http.StatusUnauthorized)
    w.Write([]byte("Wrong Json!"))
}

更多关于Golang解析数据时遇到的字符问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

你好

现在没问题了。

感谢你这么做!

更多关于Golang解析数据时遇到的字符问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好

在文本中使用反斜杠,例如用于街道地址。

你好

你获取的json中反斜杠使用是否正确?\n 表示换行符,\t 表示制表符,而 \ 就只是一个反斜杠。

能否请您展示导致问题的原始JSON(或其简化版本)以及err的值?

// 代码示例保留区域

大家好

主题中的文本内容如下:

{"requestor":"miha@test.com","Subject":"Test DE ESPA \321A, S.A.U 123321-SITEM-434343","Text":"Pruebas API VENDOR Test","telefonicaid":"INC000001069347","circuitid": "12312321231"}

当主题中包含""字符时,我通过反序列化得不到任何数据。如果删除这个字符,就能正常工作并获取反序列化数据。是否会出现错误?没有,只是数据没有正确反序列化。

是的,这是无效的 JSON,我猜引号是被论坛软件替换了,但你仍然需要转义反斜杠:

{
  "requestor": "miha@test.com",
  "Subject": "Test DE ESPA \\321A, S.A.U 123321-SITEM-434343",
  "Text": "Pruebas API VENDOR Test",
  "telefonicaid": "INC000001069347",
  "circuitid": "12312321231"
}

图片 miha:

如果主题中包含" \ ",解组后我什么也得不到。

我很确定那时你会在 err 中得到非 nil 的值…

图片 Go Playground - Go 编程语言

图片

字符串转义代码中的字符 ‘3’ 无效

在Go语言中,当JSON数据包含反斜杠字符时,确实可能导致反序列化问题。反斜杠在JSON中用作转义字符,如果处理不当会导致解析错误。以下是解决方案:

问题分析

当JSON字符串包含未正确转义的反斜杠时,json.Unmarshal会返回错误,因为这不是有效的JSON格式。

解决方案

1. 确保输入JSON正确转义

发送方需要确保所有特殊字符(包括反斜杠)都正确转义:

// 正确的JSON应该将反斜杠转义为\\
{
    "subject": "路径为C:\\\\Users\\\\file.txt",
    "requestor": "user1",
    "text": "正常内容"
}

2. 在Go中预处理JSON字符串

如果无法控制输入源,可以在反序列化前清理字符串:

import (
    "encoding/json"
    "strings"
)

func cleanJSONString(data []byte) []byte {
    str := string(data)
    // 处理未转义的反斜杠
    str = strings.ReplaceAll(str, `\`, `\\`)
    return []byte(str)
}

// 使用清理后的数据进行反序列化
cleanedBody := cleanJSONString(body)
err = json.Unmarshal(cleanedBody, &t)
if err != nil {
    w.WriteHeader(http.StatusBadRequest)
    w.Write([]byte("Invalid JSON format: " + err.Error()))
    return
}

3. 使用更健壮的错误处理

改进错误处理以提供更多信息:

type Ticket struct {
    Requestor    string `json:"requestor"`
    Subject      string `json:"subject"`
    Text         string `json:"text"`
    TelefonicaID string `json:"telefonicaid"`
    Circuitid    string `json:"circuitid"`
}

var t Ticket
err = json.Unmarshal(body, &t)

if err != nil {
    w.WriteHeader(http.StatusBadRequest)
    errorMsg := map[string]string{
        "error": "JSON解析失败",
        "details": err.Error(),
    }
    errorJSON, _ := json.Marshal(errorMsg)
    w.Write(errorJSON)
    return
}

// 成功处理
w.WriteHeader(http.StatusOK)
response := map[string]string{"status": "success"}
responseJSON, _ := json.Marshal(response)
w.Write(responseJSON)

4. 验证和调试方法

添加调试代码来检查原始JSON:

import "fmt"

// 调试用:打印原始JSON
fmt.Printf("原始JSON: %s\n", string(body))

// 尝试解析并捕获具体错误
var raw map[string]interface{}
if err := json.Unmarshal(body, &raw); err != nil {
    fmt.Printf("解析错误: %v\n", err)
    // 这里可以添加更具体的错误处理
}

完整示例

func handleTicket(w http.ResponseWriter, r *http.Request) {
    body, err := io.ReadAll(r.Body)
    if err != nil {
        http.Error(w, "无法读取请求体", http.StatusBadRequest)
        return
    }
    
    // 预处理JSON字符串
    cleanedBody := cleanJSONString(body)
    
    var ticket Ticket
    if err := json.Unmarshal(cleanedBody, &ticket); err != nil {
        http.Error(w, fmt.Sprintf("JSON解析错误: %v", err), http.StatusBadRequest)
        return
    }
    
    // 成功处理票据数据
    fmt.Printf("处理票据: %+v\n", ticket)
    w.WriteHeader(http.StatusOK)
}

主要问题在于确保输入的JSON格式正确,所有特殊字符都正确转义。如果无法控制数据源,需要在解析前进行适当的字符串清理。

回到顶部