2017-11-07 2 views
-3

신고하기 전에 해당 내용을 읽으십시오.GoLang JSON 디코딩

{ 
     "out_key": { 
     "some_uri": "url", 
     "more_than_one_key_here": { 
      "Ip": "127.0.0.1", 
      "port": "80", 
     } 
    } 
    } 

out_key이 동적으로 생성됩니다. 그것의 이름을 추측하는 것은 없습니다. 마찬가지로, more_than_one_key_here도 동적으로 생성됩니다. some_uriout_key에서 계속 유지됩니다. 이러한 시나리오에서 JSON 디코딩 구조체는 어떻게 만듭니 까?

+3

구조체 대신지도를 사용하지 않는 이유는 무엇입니까? – JimB

+0

나는 morekey map [string] struct_for_ip_port 타입을 할당하고 "some_url"과 "morekey"struct를 취한 다른 구조체를 생성 해 보았습니다. 그것은 작동하지 않는 것 같습니다. 더하기, "morekey"는 "morekey"를 실제 키 이름으로 대체하기보다는 "morekey"를 통해 참조해야합니다. 그것은 바람직하지 않습니다. – rickydj

+2

찾고있는 것을 보여줄 수 있습니까? 동적 키를 원할 경우지도를 사용해야하므로 맵이 충분하지 않으면 원하는 것을 이해하지 못합니다. – JimB

답변

-3

Ip와 포트에 대한 구조체와 키 중 하나에 대한 별도의 구조체를 만들 수 있습니다. 당신은 JSON을 디코딩하고 동적 키를 일단

type data struct{ 
    Ip string 
    port string 
} 

type DynamicKey map[string]data 

그럼, 이것은 단지 하나의 열쇠하지만 코스 꺼져은 (rando_key)이

fmt.Println(DynamicKey[rando_key].Ip, DynamicKey[rando_key].port) 

을 할 수있다 예를 들어 가정 해 봅시다 프로세스를 반복 할 수 있습니다.

2

Go에서 구조체의 필드 이름은 컴파일 할 때 알아야합니다. 그래서, 귀하의 경우에는 구조체 유형이 적절하지 않습니다. 또는지도를 사용할 수 있습니다.

IP 및 포트 값만 관심이 있다고 가정 해 보겠습니다. 그런 다음 JSON 객체의 키를 모두 무시할 수 있습니다.

package main 

import (
    "encoding/json" 
    "fmt" 
    "log" 
) 

const data = `{ 
    "out_key": { 
     "some_uri": "url", 
     "more_than_one_key_here": { 
      "Ip": "127.0.0.1", 
      "port": "80" 
     } 
    } 
}` 

func main() { 
    m := make(map[string]map[string]interface{}) 
    err := json.Unmarshal([]byte(data), &m) 
    if err != nil { 
     log.Fatalf("failed to parse JSON: %v", err) 
    } 

    for _, value := range m { 
     for _, value := range value { 
      m, ok := value.(map[string]interface{}) 
      if ok { 
       fmt.Printf("IP: %s\n", m["Ip"]) 
       fmt.Printf("Port: %s\n", m["port"]) 
      } 
     } 
    } 
}