Подтвердить что ты не робот

Легкий способ проверить строку в формате json в golang?

Я хочу создать функцию для получения входной строки, которая может быть строкой в ​​формате json или просто строкой. Например, что-то простое, как следующая функция.

func checkJson(input string){
   if ... input is in json ... {
      fmt.Println("it json!")
   } else {
      fmt.Println("it normal string!")
   }
}
4b9b3361

Ответ 1

Мне было непонятно, нужно ли вам знать только о "цитируемой строке" или если вам нужно знать о json или о различии между ними, поэтому это показывает вам, как определять оба сценария, чтобы вы могли быть очень конкретными.

Я также разместил здесь образец интерактивного кода: http://play.golang.org/p/VmT0BVBJZ7

package main

import (
    "encoding/json"
    "fmt"
)

func isJSONString(s string) bool {
    var js string
    return json.Unmarshal([]byte(s), &js) == nil

}

func isJSON(s string) bool {
    var js map[string]interface{}
    return json.Unmarshal([]byte(s), &js) == nil

}

func main() {
    var tests = []string{
        `"Platypus"`,
        `Platypus`,
        `{"id":"1"}`,
    }

    for _, t := range tests {
        fmt.Printf("isJSONString(%s) = %v\n", t, isJSONString(t))
        fmt.Printf("isJSON(%s) = %v\n\n", t, isJSON(t))
    }

}

Что выведет это:

isJSONString("Platypus") = true
isJSON("Platypus") = false

isJSONString(Platypus) = false
isJSON(Platypus) = false

isJSONString({"id":"1"}) = false
isJSON({"id":"1"}) = true

Ответ 2

Для всех, кто ищет способ проверки любой строки JSON независимо от схемы, попробуйте следующее:

func IsJSON(str string) bool {
    var js json.RawMessage
    return json.Unmarshal([]byte(str), &js) == nil
}

Ответ 3

Например,

package main

import (
    "encoding/json"
    "fmt"
)

func isJSONString(s string) bool {
    var js string
    err := json.Unmarshal([]byte(s), &js)
    return err == nil
}

func main() {
    fmt.Println(isJSONString(`"Platypus"`))
    fmt.Println(isJSONString(`Platypus`))
}

Вывод:

true
false

Ответ 4

как вы используете что-то вроде этого:

if err := json.Unmarshal(input, temp_object); err != nil {
    fmt.Println("it normal string!")
} else {
    fmt.Println("it json!")
}

Ответ 5

В поисках ответа на этот вопрос я нашел https://github.com/asaskevich/govalidator, который был привязан к этому сообщению в блоге, в котором описывается создание ввода валидатор: https://husobee.github.io/golang/validation/2016/01/08/input-validation.html. На всякий случай, когда кто-то ищет быструю библиотеку, я подумал, что было бы полезно разместить этот инструмент в удобном для поиска месте.

Этот пакет использует тот же метод для isJSON, который предлагает Уильям Кинг, следующим образом:

// IsJSON check if the string is valid JSON (note: uses json.Unmarshal).
func IsJSON(str string) bool {
    var js json.RawMessage
    return json.Unmarshal([]byte(str), &js) == nil
}

Этот пакет дал мне более глубокое представление о JSON в go, поэтому было полезно поместить здесь.

Ответ 6

Текущий принятый ответ (по состоянию на июль 2017 года) терпит неудачу для массивов JSON и не обновлен: https://repl.it/J8H0/10

Попробуйте следующее:

func isJSON(s string) bool {
  var js interface{}
  return json.Unmarshal([]byte(s), &js) == nil
}

Или решение Уильяма Кинга, которое лучше.