"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > GO가 혼합 된 데이터 유형을 가진 JSON 배열을 어떻게 구제 할 수 있습니까?

GO가 혼합 된 데이터 유형을 가진 JSON 배열을 어떻게 구제 할 수 있습니까?

2025-03-23에 게시되었습니다
검색:211

How Can I Unmarshal a JSON Array with Mixed Data Types in Go?

Go's Method for Arbitrary Data Decoding

As outlined in Go's official documentation on JSON encoding, it is possible to decode arbitrary data into an interface{} using the json.Unmarshal function. 유형 어제를 사용하면 데이터 유형을 동적으로 결정할 수 있습니다.

코드 적응

코드의 다음 버전은 다음 접근 방식을 보여줍니다.

패키지 메인. 수입 (수입) "인코딩/json" "FMT" )) var my_json string =`{ "an_array": [ "with_a string", { "및": "some_more", "다른": ]] } ]] }` FUNC IDINDATATATYPES (f 인터페이스 {}) { 스위치 vf : = f. (유형) { case map [string] 인터페이스 {} : fmt.println ( "맵 :") K, V : = 범위 vf { 스위치 vv : = v. (유형) { 사례 문자열 : fmt.printf ( " %v : is string- %q \ n", k, vv) 사례 int : fmt.printf ( " %v : is int- %q \ n", k, vv) 기본: fmt.printf ( "%v :", k) 식별 데이터 타입 (V) } } CASE [] 인터페이스 {} : fmt.println ( "배열입니다 :") K, V : = 범위 vf { 스위치 vv : = v. (유형) { 사례 문자열 : fmt.printf ( " %v : is string- %q \ n", k, vv) 사례 int : fmt.printf ( " %v : is int- %q \ n", k, vv) 기본: fmt.printf ( "%v :", k) 식별 데이터 타입 (V) } } } } func main () { fmt.println ( "json : \ n", my_json, "\ n") var f 인터페이스 {} err : = json.unmarshal ([] byte (my_json), & f) err! = nil {인 경우 fmt.println (err) } 또 다른 { fmt.printf ( "JSON :") 식별 데이터 타입 (F) } }

output

package main

import (
    "encoding/json"
    "fmt"
)

var my_json string = `{
    "an_array":[
    "with_a string",
    {
        "and":"some_more",
        "different":["nested", "types"]
    }
    ]
}`

func IdentifyDataTypes(f interface{}) {
    switch vf := f.(type) {
    case map[string]interface{}:
        fmt.Println("is a map:")
        for k, v := range vf {
            switch vv := v.(type) {
            case string:
                fmt.Printf("%v: is string - %q\n", k, vv)
            case int:
                fmt.Printf("%v: is int - %q\n", k, vv)
            default:
                fmt.Printf("%v: ", k)
                IdentifyDataTypes(v)
            }

        }
    case []interface{}:
        fmt.Println("is an array:")
        for k, v := range vf {
            switch vv := v.(type) {
            case string:
                fmt.Printf("%v: is string - %q\n", k, vv)
            case int:
                fmt.Printf("%v: is int - %q\n", k, vv)
            default:
                fmt.Printf("%v: ", k)
                IdentifyDataTypes(v)
            }

        }
    }
}

func main() {

    fmt.Println("JSON:\n", my_json, "\n")

    var f interface{}
    err := json.Unmarshal([]byte(my_json), &f)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("JSON: ")
        IdentifyDataTypes(f)
    }
}
코드는 다음 출력을 생성합니다 :

json : { "an_array": [ "with_a string", { "및": "some_more", "다른": ]] } ]] } JSON :지도입니다. an_array : 배열입니다. 0 : is String- "with_a string" 1 :지도입니다. 그리고 : 문자열 - "some_more" 다른 : 배열입니다. 0 : is String- "중첩" 1 : is string- "type"

이 접근법은 배열 내에서 요소 유형을 동적 식별 및 처리 할 수 ​​있으므로, 당신의 불안정한 요구에 대한 다재다능한 솔루션을 제공합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3