2015-07-17 18 views
9
type Struct struct { 
    Value string `json:"value"` 
    Value1 string `json:"value_one"` 
    Nest Nested `json:"nest"` 
} 

type Nested struct { 
    Something string `json:"something"` 
} 

Tôi muốn thêm các phần tử không có trong định nghĩa cấu trúc mà không tạo kiểu cấu trúc khác. Ví dụGolang sửa đổi json mà không cần cấu trúc

Struct.Extra1 = Nested{"yy"} 
Struct.Nested.Extra2 = "zz" 

Mà sẽ dẫn

{ 
    "Value": "xx", 
    "Value1": "xx", 
    "Extra1": { 
     "Something", "yy" 
    }, 
    "Nest": { 
     "Something": "xx", 
     "Extra2": "zz" 
    } 
} 

SOLUTION1: Tôi nghĩ thêm omitempty để đạt được điều này nhưng nó làm cho các cấu trúc phức tạp.

type Struct struct { 
    Value string 
    Value1 string 
    Nest Nested 
    Extra1 Nested `json:"omitempty"` 
} 

type Nested struct { 
    Something string 
    Extra2 string `json:"omitempty"` 
} 

Solution2:

myextras := make(map[string]interface{}) 
// get Struct.Nested in map[string]interface{} format 
myextras = Struct.Nest 
myextras["Extra2"] = "zz" 

// get Struct in map[string]interface{} format 
struct["Nest"] = myextras 
struct["Extra1"] = Nested{"yy"} 

// solves the problem with lots of type casting but doesn't support json tag naming 

Có một giải pháp tốt hơn để thêm các yếu tố lồng nhau mà không được đại diện trong struct datatype với sự hỗ trợ json-tag và có thể được sử dụng để đầu ra cho người sử dụng.

Trả lời

6

Dựa trên câu trả lời này:. Can I use MarshalJSON to add arbitrary fields to a json encoding in golang?

Bạn có thể làm điều gì đó tương tự (bản demo : http://play.golang.org/p/dDiTwxhoNn):

package main 

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

type Book struct { 
    Title string 
    Author string 

    // extra is used for additional dynamic element marshalling 
    extra func() interface{} 
} 

type FakeBook Book 

func (b *Book) SetExtra(fn func() interface{}) { 
    b.extra = fn 
} 

func (b *Book) MarshalJSON() ([]byte, error) { 
    if b.extra == nil { 
     b.extra = func() interface{} { return *b } 
    } 

    return json.Marshal(b.extra()) 
} 

func main() { 
    ms := &Book{ 
     Title: "Catch-22", 
     Author: "Joseph Heller", 
    } 

    ms.SetExtra(func() interface{} { 
     return struct { 
      FakeBook 
      Extra1 struct { 
       Something string `json:"something"` 
      } `json:"extra1"` 
     }{ 
      FakeBook: FakeBook(*ms), 
      Extra1: struct { 
       Something string `json:"something"` 
      }{ 
       Something: "yy", 
      }, 
     } 
    }) 

    out, err := json.MarshalIndent(ms, "", " ") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    fmt.Println(string(out)) 

    mb := &Book{ 
     Title: "Vim-go", 
     Author: "Fatih Arslan", 
    } 

    mb.SetExtra(func() interface{} { 
     return struct { 
      FakeBook 
      Something string `json:"something"` 
     }{ 
      FakeBook: FakeBook(*mb), 
      Something: "xx", 
     } 
    }) 

    out, err = json.MarshalIndent(mb, "", " ") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    fmt.Println(string(out)) 

    mc := &Book{ 
     Title: "Another-Title", 
     Author: "Fatih Arslan", 
    } 

    out, err = json.MarshalIndent(mc, "", " ") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    fmt.Println(string(out)) 
} 
+1

Kể từ khi chỉnh sửa hoàn toàn hợp lệ của tôi đã bị từ chối bởi các mods như "nên là một bình luận "(mặc dù đây là một sự lãng phí rất lớn của không gian như một bình luận) - lưu ý rằng bạn không cần' json: "-" 'để ngăn chặn thêm từ serializing, vì nó không được xuất khẩu. –

+0

Cảm ơn @NateFinch vì thông tin, có ý nghĩa. Tôi đang chỉnh sửa nó thay cho bạn. –

2

có. có một loại json.Raw mà không phải là một struct nhưng [] byte. bạn có thể quản lý nó ra khỏi cấu trúc, trong bất kỳ nguyên soái/unmarshal cách.

+0

bạn có thể cung cấp mã để thêm ' "Extra2"' ở định dạng json.Raw Thats phần khó khăn – Thellimist

2

Phương pháp bản đồ là cách lành mạnh duy nhất để làm điều đó, mọi thứ khác (như json.RawMessage lĩnh vực sẽ yêu cầu thêm bước marshalling nào

Các vấn đề liên quan