알 수 없는 구조로 JSON을 디코딩합니다.
다음과 같은 json을 나타내는 문자열을 가져옵니다.
{ "votes": { "option_A": "3" } }
"count" 키를 포함하면 다음과 같이 끝납니다.
{ "votes": { "option_A": "3" }, "count": "1" }
그래서 카운트를 추가하고 다시 문자열로 만들 수 있도록 json으로 변환하려고 했습니다.문제는 그 JSON의 구조를 모르기 때문에 사용할 수 없다는 것입니다.json.Unmarshal(in, &myStruct)그 구조가 다양하기 때문입니다.이거 어떻게 해?
에 대해 언마샬링하다.map[string]interface{}:
package main
import "encoding/json"
func main() {
in := []byte(`{ "votes": { "option_A": "3" } }`)
var raw map[string]interface{}
if err := json.Unmarshal(in, &raw); err != nil {
panic(err)
}
raw["count"] = 1
out, err := json.Marshal(raw)
if err != nil {
panic(err)
}
println(string(out))
}
https://play.golang.org/p/o8ZwvgsQmoO
단일 구조만 있으면 됩니다. 설명에서 언급한 바와 같이 필드에 올바른 주석을 달면 원하는 결과를 얻을 수 있습니다.JSON은 극단적으로 변형된 데이터 형식이 아니며, 잘 정의되어 있으며, 아무리 복잡하고 혼란스럽더라도 스키마, Go 및 대부분의 다른 OO 프로그래밍 언어로 100% 정확도로 매우 쉽게 표현할 수 있습니다.예를 들어 보겠습니다.
package main
import (
"fmt"
"encoding/json"
)
type Data struct {
Votes *Votes `json:"votes"`
Count string `json:"count,omitempty"`
}
type Votes struct {
OptionA string `json:"option_A"`
}
func main() {
s := `{ "votes": { "option_A": "3" } }`
data := &Data{
Votes: &Votes{},
}
err := json.Unmarshal([]byte(s), data)
fmt.Println(err)
fmt.Println(data.Votes)
s2, _ := json.Marshal(data)
fmt.Println(string(s2))
data.Count = "2"
s3, _ := json.Marshal(data)
fmt.Println(string(s3))
}
https://play.golang.org/p/ScuxESTW5i
가장 최근의 코멘트에 근거해, 다음의 코멘트를 사용해 그 문제를 해결할 수 있습니다.interface{}카운트 이외의 데이터를 나타내어 카운트를 문자열로 하고 나머지 블롭을 밀어넣다interface{}기본적으로 어떤 것이든 받아들일 수 있습니다.하지만, Go는 상당히 엄격한 유형의 정적 입력 언어이며, 다시 한 번 강조하자면, "그것은 무엇이든 될 수 있다"는 당신의 언급은 사실이 아닙니다.JSON은 아무것도 될 수 없습니다.JSON의 모든 부분에는 스키마가 있으며 단일 스키마는 많은 JSON의 변형을 정의할 수 있습니다.데이터 구조를 이해하는 데 시간을 할애할 것을 권합니다.데이터의 구조를 해킹하는 것이 아니라 데이터 구조를 이해하는 데 시간을 할애할 것을 권장합니다.데이터가 어떤 일을 하고 있는지 알고 있는 사람에게는 정의할 수 없고 아마 매우 쉽다고 생각할 수 있습니다.
언급URL : https://stackoverflow.com/questions/40429296/decode-json-with-unknown-structure
'programing' 카테고리의 다른 글
| Word Press vs Expression Engine: EE는 가격 대비 가치가 있습니까? (0) | 2023.04.01 |
|---|---|
| 영숫자가 아닌 문자를 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.01 |
| Windows Server 2016에서 WordPress에 디렉터리 wp-content를 만들 수 없습니다. (0) | 2023.04.01 |
| Larabel 및 Wordpress가 동일한 서버/도메인 상에 있음 (0) | 2023.04.01 |
| toString()을 구현할 때 reflection을 사용하는 것이 의미가 있습니까? (0) | 2023.04.01 |