Преобразование строки в стиле JSON в структуру в Go

У меня есть JSON вроде:

{
"key1": "value1",
"key2": "value2"
}

Я сохраняю это как строковый тип в AWS SSM. Он возвращает строку, которая выглядит так:

"{\n\"key1\": \"value1\",\n\"key2\": \"value2\"\n}"

Я понял, что когда у меня есть простой JSON в виде строки вроде {"key1": "value1", "key2": "value2"}

Я могу просто сделать это

package main

import (
    "fmt"
    "encoding/json"
)

type Request struct {
    key1 string          `json:"key1"`
    key2 string          `json:"key2"`
}

func main() {
    s := `{"key1": "value1","key2": "testing"}`
    data := Request{}
    json.Unmarshal([]byte(s), &data)
    fmt.Printf("key1: %s \n", data.key1)
    fmt.Printf("key2: %s", data.key2)
}

Как сохранить значение, подобное JSON, в SSM, а затем демаршалировать его на ходу? Или есть способ преобразовать строку в JSON, а затем структурировать?

0 ответов

Я понял, что когда у меня есть простой JSON в виде строки типа {"key1": "value1", "key2": "value2"}, я могу просто сделать это

Ваш текущий код не будет работать. Поля вашей структуры должны быть общедоступными, чтобы пакет json мог получить к ним доступ.

package main

import (
    "fmt"
    "encoding/json"
)

type Request struct {
    Key1 string          `json:"key1"`
    Key2 string          `json:"key2"`
}

func main() {
    s := `{"key1": "value1","key2": "testing"}`
    data := Request{}
    json.Unmarshal([]byte(s), &data)
    fmt.Printf("key1: %s \n", data.Key1)
    fmt.Printf("key2: %s", data.Key2)
}

Я сохраняю это как строковый тип в AWS SSM. Он возвращает строку вида: "{\n" ключ1 ":" значение1",\n" ключ2 ":" значение2"\n}"

Не уверен в AWS SSM, но я предлагаю вам посмотреть, как вы публикуете и извлекаете данные. Никакие внешние службы не должны изменять ваши данные.

Но если вы не можете, вы можете отменить экранирование перед демаршингом.

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

type Request struct {
    Key1 string `json:"key1"`
    Key2 string `json:"key2"`
}

func main() {
    s := `"{\n\"key1\": \"value1\",\n\"key2\": \"value2\"\n}"`
    s, _ = strconv.Unquote(string(s))
    data := Request{}
    json.Unmarshal([]byte(s), &data)
    fmt.Printf("key1: %s \n", data.Key1)
    fmt.Printf("key2: %s", data.Key2)
}

Другие вопросы по тегам