Go 구조체를 JSON으로 변환


181

json패키지를 사용하여 Go 구조체를 JSON으로 변환하려고 하지만 얻는 것은 {}입니다. 나는 그것이 완전히 명백한 것이 확실하지만 그것을 보지 못한다.

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    name string
}

func main() {
    user := &User{name:"Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Printf("Error: %s", err)
        return;
    }
    fmt.Println(string(b))
}

그런 다음 실행하려고하면이를 얻습니다.

$ 6g test.go && 6l -o test test.6 && ./test 
{}

답변:


331

당신은 할 필요가 수출User.name 있도록 필드에 json패키지를 볼 수 있습니다. name필드 이름을로 바꿉니다 Name.

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    Name string
}

func main() {
    user := &User{Name: "Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}

산출:

{"Name":"Frank"}

87
`json:"name"`struct 필드 정의의 끝에 추가 하여 출력 이름을 보존 할 수 있습니다 .
더스틴

12
내가 참조. 나는 언어와 비슷하지만 일부 구문 적 요소는 멀리 가고 있다고 생각합니다. 구조체 멤버의 이름이 동작을 결정하면 이것은 잘못된 것입니다.
magiconair

1
글쎄, 이름이 동작이 좋든 나쁘면 토론 할 수 있다고 결정하는 것이지만 :) 다른 곳을 확인하지 않고도 필드가 내보내 졌는지 아닌지를 쉽게 알 수 있습니다.
Olof

6
@magiconair : 첫 번째 룬의 대문자는 가시성을 결정 하고, "구조체 멤버의 이름이 행동을 결정하는" 보다 훨씬 합리적인 생각 입니다. 가시성 메타 데이터는 어딘가에 저장해야하며이를 표현하려면 구문이 필요합니다. 결국 첫 번째 문자의 대문자를 사용하는 것이 가장 적은 트레이드 오프에서 가장 잘 작동한다고 결정되었습니다. Go1 릴리스 전에 다른 체계가 시도되고 거부되었습니다.
deft_code

11
나는 지금까지 대문자로 내보내기를 포함한 언어를 좋아하고 먼 길을 왔습니다.
magiconair

62

관련 문제 :

구조체를 JSON으로 변환하여 Golang의 응답으로 보낸 다음 나중에 Ajax를 통해 JavaScript에서 동일하게 catch하는 데 문제가있었습니다.

많은 시간을 낭비 했으므로 여기에 솔루션을 게시하십시오.

이동 중 :

// web server

type Foo struct {
    Number int    `json:"number"`
    Title  string `json:"title"`
}

foo_marshalled, err := json.Marshal(Foo{Number: 1, Title: "test"})
fmt.Fprint(w, string(foo_marshalled)) // write response to ResponseWriter (w)

자바 스크립트에서 :

// web call & receive in "data", thru Ajax/ other

var Foo = JSON.parse(data);
console.log("number: " + Foo.number);
console.log("title: " + Foo.title);

이것이 누군가를 돕기를 바랍니다.
행운을 빕니다.


6

구조 값은 JSON 객체로 인코딩됩니다. 다음과 같은 경우를 제외하고 내 보낸 각 구조체 필드는 객체의 멤버가됩니다.

  • 필드의 태그가 "-"이거나
  • 필드가 비어 있고 해당 태그는 "omitempty"옵션을 지정합니다.

빈 값은 false, 0, nil 포인터 또는 인터페이스 값, 길이가 0 인 배열, 슬라이스, 맵 또는 문자열입니다. 객체의 기본 키 문자열은 구조체 필드 이름이지만 구조체 필드의 태그 값으로 지정할 수 있습니다. struct 필드의 태그 값에있는 "json"키는 키 이름이며 쉼표와 옵션 (옵션)이 뒤에옵니다.


2

사용자 정의 MarshalJSON 및 UnmarshalJSON 메소드를 정의하고 포함해야 할 내용을 의도적으로 제어 할 수 있습니다 (예 :

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    name string
}

func (u *User) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
        Name     string `json:"name"`
    }{
        Name:     "customized" + u.name,
    })
}

func main() {
    user := &User{name: "Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.