2016-11-04 21 views
7

Tôi muốn có được một chuỗi đại diện cho một json như thế này một:Chuyển đổi chuỗi json hoặc struct trong GoLang

{ "phiếu bầu": { "option_A": "3"}}

và bao gồm một "đếm" chủ chốt trong nó để nó kết thúc như thế này:

{ "phiếu bầu": { "option_A": "3"}, "đếm": "1"}

Đây là lý do tại sao tôi dự định chuyển đổi nó thành json để tôi có thể thêm số lượng và sau đó đặt lại chuỗi đó. Vấn đề là tôi không biết cấu trúc của json đó, vì vậy tôi không thể sử dụng json.Unmarshal(in, &myStruct) vì cấu trúc đó thay đổi. Tôi có thể làm như thế nào? Cảm ơn bạn rất nhiều

+0

Trong mystruct, chú thích số lượng biến để được bỏ qua nếu không có mặt. Thêm cái này vào trước biến của bạn 'json:", omitempty "' – Aus

+0

Tôi không có định nghĩa về MyStruct vì nó có thể hoàn toàn bất cứ điều gì. Tôi chỉ cần bao gồm phím đếm đó cho bất kỳ json nào mà chuỗi đại diện. Nhưng cảm ơn cho bình luận. –

Trả lời

12

Bạn thực sự chỉ cần một cấu trúc duy nhất và như được đề cập trong phần nhận xét, chú thích chính xác trên trường sẽ mang lại kết quả mong muốn. JSON không phải là định dạng dữ liệu cực kỳ biến thể, nó được định nghĩa rõ ràng và bất kỳ phần tử json nào, cho dù bạn có phức tạp và khó hiểu đến mức nào, bạn có thể biểu diễn khá dễ dàng và với độ chính xác 100% cả lược đồ và đối tượng trong Go và hầu hết các ngôn ngữ lập trình OO khác. Đây là một ví dụ;

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type Data struct { 
    Votes *Votes `json:"votes"` 
    Count string `json:"count,omitempty"` 
} 

type Votes struct { 
    OptionA string `json:"option_A"` 
} 

func main() { 
    s := `{ "votes": { "option_A": "3" } }` 
    data := &Data{ 
     Votes: &Votes{}, 
    } 
    err := json.Unmarshal([]byte(s), data) 
    fmt.Println(err) 
    fmt.Println(data.Votes) 
    s2, _ := json.Marshal(data) 
    fmt.Println(string(s2)) 
    data.Count = "2" 
    s3, _ := json.Marshal(data) 
    fmt.Println(string(s3)) 
} 

https://play.golang.org/p/ScuxESTW5i

Dựa trên nhận xét gần đây nhất của bạn, bạn có thể giải quyết điều đó bằng cách sử dụng một interface{} để đại diện cho dữ liệu bên cạnh số lượng, làm cho đếm một chuỗi và có phần còn lại của blob xô đẩy vào interface{} mà sẽ chấp nhận về cơ bản bất cứ điều gì. Điều đó đang được nói, Go là một ngôn ngữ gõ tĩnh với một hệ thống kiểu khá nghiêm ngặt và để nhắc lại, ý kiến ​​của bạn nói rằng 'nó có thể là bất cứ điều gì' là không đúng sự thật. JSON không thể là gì cả. Đối với bất kỳ mẩu JSON nào có lược đồ và một lược đồ có thể xác định nhiều biến thể của JSON. Tôi khuyên bạn nên dành thời gian để hiểu cấu trúc dữ liệu của bạn thay vì hacking một cái gì đó với nhau theo ý niệm rằng nó không thể được xác định khi nó hoàn toàn có thể và có lẽ khá dễ dàng cho một người biết những gì họ đang làm.

+1

lưu ý phụ: chỉ các thuộc tính được viết hoa trong cấu trúc mới được đưa vào JSON. Các thuộc tính riêng sẽ bị bỏ qua bởi marshaller –

19
package main 

import "encoding/json" 

func main() { 
    in := []byte(`{ "votes": { "option_A": "3" } }`) 
    var raw map[string]interface{} 
    json.Unmarshal(in, &raw) 
    raw["count"] = 1 
    out, _ := json.Marshal(raw) 
    println(string(out)) 
} 

https://play.golang.org/p/QUyL3cyTAC

+3

thanh lịch! và dễ hiểu – NinjaGaiden

+0

Rất đẹp, không có cấu trúc cần thiết và vào thời điểm đó! – Nebulosar

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