Разбор сбежавшей строки json в Golang

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