Go 맵을 json으로 변환
Go 맵을 json 문자열로 변환하려고 했습니다.encoding/json
보안관님, 하지만 결국 공염불이 됐습니다
제 코드는 다음과 같습니다.
package main
import (
"encoding/json"
"fmt"
)
type Foo struct {
Number int `json:"number"`
Title string `json:"title"`
}
func main() {
datas := make(map[int]Foo)
for i := 0; i < 10; i++ {
datas[i] = Foo{Number: 1, Title: "test"}
}
jsonString, _ := json.Marshal(datas)
fmt.Println(datas)
fmt.Println(jsonString)
}
출력은 다음과 같습니다.
map[9:{1 test} 2:{1 test} 7:{1 test} 3:{1 test} 4:{1 test} 5:{1 test} 6:{1 test} 8:{1 test} 0:{1 test} 1:{1 test}]
[]
내가 어디서 틀렸는지 정말 모르겠어.도와주셔서 고맙습니다.
에러를 검출했을 경우는, 다음과 같이 표시됩니다.
jsonString, err := json.Marshal(datas)
fmt.Println(err)
// [] json: unsupported type: map[int]main.Foo
JSON에서는 정수를 키로 사용할 수 없습니다.이는 금지되어 있습니다.대신, 예를 들어 다음과 같이 이러한 값을 미리 문자열로 변환할 수 있습니다.strconv.Itoa
.
상세한 것에 대하여는, 다음의 투고를 참조해 주세요.https://stackoverflow.com/a/24284721/2679935
실제로는 무엇이 문제인지 알 수 있지만, 에러가 반환된 것을 확인하지 않았기 때문에 무시한 것입니다.json.Marshal
.
json: unsupported type: map[int]main.Foo
JSON 스펙은 오브젝트 키 문자열 이외에는 지원하지 않지만 javascript는 까다롭지 않지만 여전히 불법입니다.
두 가지 옵션이 있습니다.
1 사용map[string]Foo
fmt를 사용하여 인덱스를 문자열로 변환합니다.예를 들어 스프린트:
datas := make(map[string]Foo, N)
for i := 0; i < 10; i++ {
datas[fmt.Sprint(i)] = Foo{Number: 1, Title: "test"}
}
j, err := json.Marshal(datas)
fmt.Println(string(j), err)
2 슬라이스(Javascript 배열)를 사용하면 됩니다.
datas2 := make([]Foo, N)
for i := 0; i < 10; i++ {
datas2[i] = Foo{Number: 1, Title: "test"}
}
j, err = json.Marshal(datas2)
fmt.Println(string(j), err)
이 동작은 시간이 지남에 따라 변경되었습니다.go v1.16.5를 사용하고 있으며, JSON 키로 int 타입을 자유롭게 전달할 수 있습니다.저는 지금 같은 문제를 시도해 보았고, 아래의 결과를 알 수 있습니다.문자열 이외의 키의 유형 변환이 textMarshaler 및 textUnmarshaler 인터페이스에 의해 추가되었습니다.상세한 것에 대하여는, https://golang.org/pkg/encoding/json/#Marshal 를 참조해 주세요.
type Foo struct {
Number int `json:"number"`
Title string `json:"title"`
}
datas := make(map[int]Foo)
for i := 0; i < 5; i++ {
datas[i] = Foo{Number: 1, Title: "test"}
}
jsonString, _ := json.Marshal(datas)
fmt.Println("Datasets Result : ", datas)
fmt.Println("Marshal Datasets Result : ", string(jsonString), err)
m := make(map[int]Foo)
err = json.Unmarshal(jsonString, &m)
if err != nil {
panic(err)
}
fmt.Println("Unmarshal JSON Result : ", m)
출력:
Datasets Result map : [0:{1 test} 1:{1 test} 2:{1 test} 3:{1 test} 4:{1 test}]
Marshal Datasets Result : {"0":{"number":1,"title":"test"},"1":{"number":1,"title":"test"},"2":{"number":1,"title":"test"},"3":{"number":1,"title":"test"},"4":{"number":1,"title":"test"}} <nil>
Unmarshal JSON Result : map[0:{1 test} 1:{1 test} 2:{1 test} 3:{1 test} 4:{1 test}]
data := map[string]interface{}
jsonByte, err := json.Marshal(data)
if err != nil{
log.Fatal(err)
}
jsonString := string(jsonByte)
fmt.Println(jsonString) // will be printing data map in json formate.
이 질문/마지막 답변 이후 여기서 TextMarshaler 및 TextUnmarshaler 인터페이스를 사용하여 json Marshal/UnMarshal 맵에 대한 문자열 이외의 키유형에 대한 지원이 추가되었습니다.이러한 인터페이스를 키 타입에 맞추어 실장하고 나서,json.Marshal
예상대로 동작합니다.
package main
import (
"encoding/json"
"fmt"
"strconv"
)
// Num wraps the int value so that we can implement the TextMarshaler and TextUnmarshaler
type Num int
func (n *Num) UnmarshalText(text []byte) error {
i, err := strconv.Atoi(string(text))
if err != nil {
return err
}
*n = Num(i)
return nil
}
func (n Num) MarshalText() (text []byte, err error) {
return []byte(strconv.Itoa(int(n))), nil
}
type Foo struct {
Number Num `json:"number"`
Title string `json:"title"`
}
func main() {
datas := make(map[Num]Foo)
for i := 0; i < 10; i++ {
datas[Num(i)] = Foo{Number: 1, Title: "test"}
}
jsonString, err := json.Marshal(datas)
if err != nil {
panic(err)
}
fmt.Println(datas)
fmt.Println(jsonString)
m := make(map[Num]Foo)
err = json.Unmarshal(jsonString, &m)
if err != nil {
panic(err)
}
fmt.Println(m)
}
출력:
map[1:{1 test} 2:{1 test} 4:{1 test} 7:{1 test} 8:{1 test} 9:{1 test} 0:{1 test} 3:{1 test} 5:{1 test} 6:{1 test}]
[123 34 48 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 49 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 50 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 51 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 52 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 53 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 54 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 55 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 56 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 44 34 57 34 58 123 34 110 117 109 98 101 114 34 58 34 49 34 44 34 116 105 116 108 101 34 58 34 116 101 115 116 34 125 125]
map[4:{1 test} 5:{1 test} 6:{1 test} 7:{1 test} 0:{1 test} 2:{1 test} 3:{1 test} 1:{1 test} 8:{1 test} 9:{1 test}]
언급URL : https://stackoverflow.com/questions/24652775/convert-go-map-to-json
'source' 카테고리의 다른 글
mqtranslate plus on wordpress 메뉴에서 사용자 정의 링크 번역 (0) | 2023.03.15 |
---|---|
useNavigate()는 컴포넌트의 컨텍스트에서만 사용할 수 있습니다. (0) | 2023.03.15 |
무효 번호에 대응하는 PropType을 선언하려면 어떻게 해야 합니까? (0) | 2023.03.15 |
각도 양식 지시어의 단위 테스트에서 뷰 값 입력 필드 설정 (0) | 2023.03.15 |
Android에서의 Best REST 클라이언트 프레임워크/유틸리티 (0) | 2023.03.15 |