Простой запрос json возвращает странную строку, а не сам json - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь вернуть простой JSON в Go.Это веб-приложение, и вот часть обработчика:

func JsonTest1(w http.ResponseWriter, r *http.Request) {
  test1 := "something1"
  test2 := 456
  j1 := []byte(fmt.Sprintf(`
    {
      data: {
        "test1": %s,
        "test2": %d
      }
    }
  `, test1, test2))



  j2, _ := json.Marshal(&j1)
  w.Header().Set("Content-Type", "application/json")
  w.Write(j2)
 }

Когда я делаю запрос через curl, я получаю что-то вроде:

  CiAgICB7CiAgICAgIGRhdGE6IHsKICAgICAgICAicmVkaXJlY3RfdXJsIjogdGVzdF9yZWRpcl91cmwxLAogICAgICAgICJtZXNzYWdlIjogdGVzdCBtc2cgMQogICAgICB9CiAgICB9CiAg

Почему?Как это исправить?

1 Ответ

0 голосов
/ 03 января 2019

Когда вы JSON-кодируете []byte, он будет отображаться как строка в кодировке base64, наиболее эффективный способ представления произвольного байтового среза / массива в JSON (единственной реальной альтернативой является "field": [7, 129, 13, 48, ...] и т. Д. ). Однако в вашем коде вы делаете пару необычных вещей, которые могут не соответствовать тому, что задумано:

  • Вы вручную создаете строку JSON-ish, используя Sprintf, затем пытаетесь JSON-кодировать ваш JSON. json.Marshal для получения произвольного значения Go и его преобразования в JSON.
  • Ваш JSON, созданный вручную, недействителен; у вас есть значение строкового поля без кавычек.

Вероятно, вам нужен один из следующих вариантов:

// Manually-created *valid* JSON
func JsonTest1(w http.ResponseWriter, r *http.Request) {
    test1 := "something1"
    test2 := 456
    // %q instead of %s gives us a quoted string:
    j1 := []byte(fmt.Sprintf(`
    {
      data: {
        "test1": %q,
        "test2": %d
      }
    }
  `, test1, test2))

    w.Header().Set("Content-Type", "application/json")
    w.Write(j1)
}

// JSON created with json.Marshal
func JsonTest2(w http.ResponseWriter, r *http.Request) {
    test1 := "something1"
    test2 := 456
    data := map[string]interface{}{
        "data": map[string]interface{}{
            "test1": test1,
            "test2": test2,
        },
    }
    j1, _ := json.Marshal(data)
    w.Header().Set("Content-Type", "application/json")
    w.Write(j1)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...