source

다이내믹 JSON 해석/비직렬화 방법

myloves 2023. 4. 3. 21:52

다이내믹 JSON 해석/비직렬화 방법

시나리오:
JSON은 다음과 같습니다.

{
   "Bangalore_City": "35_Temperature",
   "NewYork_City": "31_Temperature",
   "Copenhagen_City": "29_Temperature"
}

이 데이터는 하드 코드화된 키가 없는 방식으로 구성되어 있습니다.City/Temperature기본적으로는 정당한 가치입니다.

문제: 다이내믹한 JSON을 해석할 수 없습니다.

질문: 이런 종류의 JSON 파싱에 대한 해결책을 찾을 수 있는 사람이 있습니까?Go-Simplejson, gabs & default를 시도했지만 실패했어요.

주의: 위의 JSON은 샘플용입니다.그리고 현재 API를 사용하고 있는 어플리케이션도 많기 때문에 데이터 구조를 변경하고 싶지 않습니다.즉, 다음과 같이 변경할 수 없습니다.

[{
   "City_Name":"Bangalore",
   "Temperature": "35"
},...]

그럼 내가 정의할 수 있어struct

type TempData struct {
  City_Name string
  Temperature  string
}

마샬을 풀 수 있습니다.map[string]string예를 들어 다음과 같습니다.

m := map[string]string{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)

출력(랩핑):

map[Bangalore_City:35_Temperature NewYork_City:31_Temperature
    Copenhagen_City:29_Temperature]

바둑 놀이터에서 시도해 보세요.

이렇게 하면 키나 값이 무엇이든 간에 모든 페어를 1개의 코스에서 사용할 수 있습니다.map인쇄하거나 루프오버할 수 있습니다.

또, 이 예에 포함되어 있는 것은,string값 유형이 다른 경우(예:string, 숫자 등)를 사용할 수 있습니다.interface{}값 유형의 경우 맵이 유형으로 지정됩니다.map[string]interface{}.

또, 이러한 동적인 오브젝트를 간단하게 조작할 수 있도록 라이브러리를 작성했습니다.이러한 경우 큰 도움이 될 수 있습니다.

표준.encoding/json대부분의 사용 사례에 적합하지만 다른 솔루션에 비해 상당히 느릴 수 있습니다.퍼포먼스가 필요한 경우 fastjson을 사용해 보십시오.JSON 스키마에 일치하는 구조체 또는 맵을 작성할 필요 없이 임의의 JSON을 해석합니다.

아래의 코드 예를 참조하십시오.이 모든 것이 반복됩니다.(key, value)JSON 오브젝트 쌍:

var p fastjson.Parser
v, err := p.Parse(input)
if err != nil {
    log.Fatal(err)
}

// Visit all the items in the top object
v.GetObject().Visit(func(k []byte, v *fastjson.Value) {
    fmt.Printf("key=%s, value=%s\n", k, v)

    // for nested objects call Visit again
    if string(k) == "nested" {
        v.GetObject().Visit(func(k []byte, v *fastjson.Value) {
            fmt.Printf("nested key=%s, value=%s\n", k, v)
        })
    }
})

유효한 JSON의 해석 방법에 대한 일반적인 답변을 추가합니다.var m interface{}모든 타입에 대응합니다.여기에는 지도(OP가 요청한) 배열, 문자열, 숫자 및 중첩된 구조가 포함됩니다.

var m interface{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)

또한 gabs 패키지 https://github.com/Jeffail/gabs를 사용하는 것도 고려해 주십시오.

"Gabs는 이동 시 동적 또는 알려지지 않은 JSON 구조를 처리하기 위한 작은 유틸리티입니다."

언급URL : https://stackoverflow.com/questions/29347092/how-to-parse-deserialize-dynamic-json