programing

알 수 없는 구조로 JSON을 디코딩합니다.

mailnote 2023. 4. 1. 09:42
반응형

알 수 없는 구조로 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

반응형