Легкий способ проверить строку в формате json в golang?
Я хочу создать функцию для получения входной строки, которая может быть строкой в формате json или просто строкой. Например, что-то простое, как следующая функция.
func checkJson(input string){
if ... input is in json ... {
fmt.Println("it json!")
} else {
fmt.Println("it normal string!")
}
}
Ответы
Ответ 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
}
Или решение Уильяма Кинга, которое лучше.