# #json #string #go #escaping
Вопрос:
Допустим, у меня есть эта строка json:
{"A":"a","B":"b","C":"c","D":2,"E":"e"}
Я хочу преобразовать приведенную выше строку в структуру:
{
A string
B string
C string
D int
E string
}
Я не уверен, как это сделать, так как я сделал цитату и не цитирую, но, похоже, пока безуспешно.
Комментарии:
1. Каковы правила цитирования для строки? Ответ зависит от используемой цитаты. Например, если строка закодирована в JSON JSON, то дважды отмените сопоставление. Если строка использует кавычки Go, используйте strconv. Без кавычек.
Ответ №1:
Оберните входящую строку, прежде чем снимать с нее кавычки, вот так:
s,err := strconv.Unquote(`"` yourstring `"`)
Затем вы можете продолжить его демонтаж.
Ответ №2:
Несколько похоже на взлом, но входная строка была бы закодирована так, как если бы она была в объекте JSON, так что вы можете сделать это:
x:=json.RawMessage(`"{"A":"a","B":"b","C":"c","D":2,"E":"e"}"`)
var v string
err:=json.Unmarshal(x,amp;v)
var x MyStruct
json.Unmarshal([]byte(v),amp;x)
Комментарии:
1. я получил ошибку:
invalid character '\' looking for beginning of object key string
2. Я использовал пакет, в котором функция принимает строку в качестве параметра, я прочитал, что параметр, получающий этот экранированный json, преобразует его в rawmessage, не раскрывается, и получил эту ошибку.
3. Необработанное сообщение имеет размер []байт. Возможно, было бы проще удалить обратную косую черту.
4. вы можете попробовать это, когда
strconv.Unquote
не работает(у вас неверный синтаксис), большое спасибо
Ответ №3:
Вы можете использовать Unquote
метод strconv
, предложенный mfathirirhas, я создал небольшой код, изображающий ваш сценарий следующим образом:
package main
import (
"encoding/json"
"fmt"
"strconv"
)
type response struct {
A string
B string
C string
D int
E string
}
func main() {
str := (`"{"A":"a","B":"b","C":"c","D":2,"E":"e"}"`)
fmt.Printf(str)
s, err := strconv.Unquote(str)
fmt.Println()
fmt.Println(s, err)
var resp response
if err := json.Unmarshal([]byte(s), amp;resp); err != nil {
panic(err)
}
fmt.Println(resp)
}
Выход:
"{"A":"a","B":"b","C":"c","D":2,"E":"e"}"
{"A":"a","B":"b","C":"c","D":2,"E":"e"} <nil>
{a b c 2 e}