/ / Analizar JSON desde un valor de cadena JSON - json, go, struct

Parse JSON de un valor de cadena JSON - json, go, struct

Quiero convertir de cadena a objeto.

De

{"key1": "{n  "key2": "value2",n  "key3": {n    "key4": "value4"n  }n}n"}

A

{"key1": {"key2": "value2", "key3": {"key4": "value4"}}}

Finalmente, quiero conseguir value4.

Puedo obtener el valor de "key1" usando el siguiente script.

jsondata := `{"key1": "{n  "key2": "value2",n  "key3": {n    "key4": "value4"n  }n}n"}`
var m map[string]interface{}
json.Unmarshal([]byte(jsondata), &m)
value := m["key1"]
fmt.Println(value)

https://play.golang.org/p/4lwgQJfp5S

Pero no puedo "convertir el valor en un objeto. Por lo tanto, no puedo" t obtener "valor4". ¿Hay métodos para esto? Lo puedo conseguir por expresiones regulares como https://play.golang.org/p/6TB-qNAdgQ Pero ahora esta no es mi solución.

Muchas gracias por su tiempo y consejos. Y lo siento por mi pregunta inmadura.

Respuestas

3 para la respuesta № 1

Hay dos niveles de codificación JSON. El primer paso es descodificar el valor JSON externo. Decodificar a una estructura que coincida con la estructura de la JSON.

var outer struct{ Key1 string }
if err := json.Unmarshal([]byte(jsondata), &outer); err != nil {
log.Fatal(err)
}

El siguiente paso es descodificar el valor JSON interno. De nuevo, decodifíquelo a una estructura que coincida con la estructura de JSON.

var inner struct{ Key3 struct{ Key4 string } }
if err := json.Unmarshal([]byte(outer.Key1), &inner); err != nil {
log.Fatal(err)
}
// The value is inner.Key3.Key4

ejemplo de patio de recreo

Si el JSON no tiene doble codificación, puede decodificar de una sola vez:

jsondata := `{"key1": { "key2": "value2",  "key3": { "key4": "value4"  }}}`
var v struct {
Key1 struct{ Key3 struct{ Key4 string } }
}
if err := json.Unmarshal([]byte(jsondata), &v); err != nil {
log.Fatal(err)
}
// value is v.Key1.Key3.Key4

ejemplo de patio de recreo