2016-11-04 11 views
7

में मैं एक स्ट्रिंग है कि यह एक तरह एक json का प्रतिनिधित्व करता है प्राप्त करना चाहते हैं:json या struct करने के लिए स्ट्रिंग परिवर्तित GoLang

{ "वोट": { "option_A": "3"}}

{ "वोट":: { "option_A": "3"}, "गिनती": "1"}

और एक "गिनती" यह करने में महत्वपूर्ण तो यह इस तरह समाप्त होता है शामिल हैं

यही कारण है कि मैंने इसे जेसन में बदलने की योजना बनाई ताकि मैं गिनती जोड़ सकूं और फिर इसे फिर से स्ट्रिंग कर सकूं। समस्या यह है कि मुझे उस जेसन की संरचना नहीं पता है, इसलिए मैं json.Unmarshal(in, &myStruct) का उपयोग नहीं कर सकता क्योंकि यह संरचना भिन्न होती है। मैं यह कैसे कर सकता हूं? बहुत बहुत धन्यवाद

+0

myStruct में, व्याख्या करता है, तो मौजूद नहीं चर गिनती छोड़ देना है। इसे अपने वैरिएबल 'जेसन: "के सामने जोड़ें, omitempty" ' – Aus

+0

मेरे पास MyStruct की परिभाषा नहीं है क्योंकि यह बिल्कुल कुछ भी हो सकती है। मुझे स्ट्रिंग का प्रतिनिधित्व करने वाले जो भी जेसन के लिए उस गिनती कुंजी को शामिल करने की आवश्यकता है। लेकिन टिप्पणी के लिए धन्यवाद। –

उत्तर

12

आपको वास्तव में केवल एक ही संरचना की आवश्यकता है, और टिप्पणियों में उल्लिखित अनुसार क्षेत्र में सही टिप्पणियां वांछित परिणाम प्राप्त करेंगी। जेएसओएन कुछ बेहद विविध डेटा प्रारूप नहीं है, यह अच्छी तरह से परिभाषित और जेसन का कोई भी टुकड़ा है, इससे कोई फर्क नहीं पड़ता कि यह कितना जटिल और भ्रमित हो सकता है, यह आपके लिए काफी आसानी से और 100% सटीकता के साथ एक स्कीमा और गो में वस्तुओं में 100% सटीकता के साथ प्रदर्शित किया जा सकता है। अधिकांश अन्य ओओ प्रोग्रामिंग भाषाओं। यहां एक उदाहरण दिया गया है;

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

अपने सबसे हाल ही टिप्पणी के आधार पर आप को संबोधित कर सकते हैं कि एक interface{} का उपयोग कर गिनती के अलावा डेटा का प्रतिनिधित्व करने के लिए एक स्ट्रिंग गिनती कर रहे हैं और ब्लॉब interface{} में shoved के बाकी होने से जो अनिवार्य रूप से कुछ भी स्वीकार करेंगे। ऐसा कहा जा रहा है कि, एक काफी सख्त प्रकार की प्रणाली के साथ एक स्थिर रूप से टाइप की गई भाषा है और दोहराने के लिए, आपकी टिप्पणियां 'यह कुछ भी हो सकती है' सच नहीं है। JSON कुछ भी नहीं हो सकता है। जेएसओएन के किसी भी टुकड़े के लिए स्कीमा है और एक स्कीमा जेएसओएन की कई विविधताओं को परिभाषित कर सकती है। मैं आपको सलाह देता हूं कि आप अपने डेटा की संरचना को समझने के बजाय समय को एक साथ हैकिंग करने के बजाय समझें कि इसे पूरी तरह से परिभाषित नहीं किया जा सकता है और शायद यह किसी के लिए काफी आसान है जो जानता है कि वे क्या कर रहे हैं।

+1

साइड नोट: केवल संरचना में पूंजीकृत विशेषताओं को JSON में शामिल किया जाएगा। निजी विशेषताओं को मार्शलर –

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

सुरुचिपूर्ण द्वारा अनदेखा कर दिया जाएगा! और समझने में आसान – NinjaGaiden

+0

बहुत अच्छा, कोई structs आवश्यक नहीं है और बिंदु पर! – Nebulosar

संबंधित मुद्दे