আংশিকভাবে JSON গো-এর মানচিত্রে আনমর্শাল


106

আমার ওয়েবসকেট সার্ভারটি JSON ডেটা গ্রহণ করবে এবং আনমেশাল করবে। এই ডেটা সর্বদা কী / মান জোড় দিয়ে কোনও বস্তুতে আবৃত থাকবে। কী-স্ট্রিংটি মান শনাক্তকারী হিসাবে কাজ করবে, যা সার্ভারকে এটির মান কী তা বলে। কী ধরণের মান জেনে, আমি তারপরে JSON- এর মানটি নিখুঁতভাবে সঠিক ধরণের কাঠামোর দিকে এগিয়ে যেতে পারি।

প্রতিটি জসন-অবজেক্টে একাধিক কী / মান জোড়া থাকতে পারে।

JSON উদাহরণ:

{
    "sendMsg":{"user":"ANisus","msg":"Trying to send a message"},
    "say":"Hello"
}

এটি করার জন্য "encoding/json"প্যাকেজটি ব্যবহার করার কোনও সহজ উপায় আছে ?

package main

import (
    "encoding/json"
    "fmt"
)

// the struct for the value of a "sendMsg"-command
type sendMsg struct {
    user string
    msg  string
}
// The type for the value of a "say"-command
type say string

func main(){
    data := []byte(`{"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},"say":"Hello"}`)

    // This won't work because json.MapObject([]byte) doesn't exist
    objmap, err := json.MapObject(data)

    // This is what I wish the objmap to contain
    //var objmap = map[string][]byte {
    //  "sendMsg": []byte(`{"user":"ANisus","msg":"Trying to send a message"}`),
    //  "say": []byte(`"hello"`),
    //}
    fmt.Printf("%v", objmap)
}

কোন ধরণের পরামর্শ / সাহায্যের জন্য ধন্যবাদ!

উত্তর:


202

এটি আনমাশালিংয়ের মাধ্যমে সম্পূর্ণ করা যায় map[string]json.RawMessage

var objmap map[string]json.RawMessage
err := json.Unmarshal(data, &objmap)

আরও বিশ্লেষণ করতে sendMsg, আপনি এর পরে কিছু করতে পারেন:

var s sendMsg
err = json.Unmarshal(objmap["sendMsg"], &s)

কারণ say, আপনি একই জিনিসটি করতে পারেন এবং একটি স্ট্রিংয়ের মধ্যে নিরবচ্ছিন্ন:

var str string
err = json.Unmarshal(objmap["say"], &str)

সম্পাদনা: মনে রাখবেন আপনাকে আপনার সেন্ড এমএসজি স্ট্রাক্টের ভেরিয়েবলগুলি সঠিকভাবে আনমর্শাল রফতানি করতে হবে। সুতরাং আপনার কাঠামো সংজ্ঞা হবে:

type sendMsg struct {
    User string
    Msg  string
}

উদাহরণ: https://play.golang.org/p/OrIjvqIsi4-


6
পারফেক্ট! আপনি কীভাবে ব্যবহার করতে পারেন তা আমি মিস করেছি RawMessage। ঠিক আমার যা প্রয়োজন ছিল। সম্পর্কে say, আমি আসলে এখনও এটি চাই json.RawMessage, কারণ স্ট্রিংটি এখনও ডিকোড হয়নি (মোড়ানো "এবং পলাতক- \nপ্রকৃতির ইত্যাদি), তাই আমি এটিও নিরবচ্ছিন্ন করব।
আনিসুস

4
আপনার উত্তরটি মিলে আমি আমার উত্তর স্থির করেছি fixed ধন্যবাদ
স্টিফেন ওয়েইনবার্গ

4
প্রকারটি মানচিত্রের [স্ট্রিং] * json.RawMessage হওয়া উচিত কারণ আনমর্ষাল / মার্শাল পদ্ধতিগুলি json.RawMessage এ প্রয়োগ করা হয় না।
অ্যালবার্ট

4
@ আলবার্ট, আমার পক্ষে কাজ করে: play.golang.org/p/XYsozrJrSl । তবে, আপনি সঠিক যে পয়েন্টার ব্যবহার করা আরও ভাল। আমার কোডটির বিপরীতটি সঠিকভাবে কাজ করে না: play.golang.org/p/46JOdjPpVI । পয়েন্টার ব্যবহার করা এটি সমাধান করে: play.golang.org/p/ZGWXkYUT3
স্টিফেন ওয়েনবার্গ

4
আপনি * json.RawMessage- এ আপডেট করার পরে, আপনাকে এখন json.Unmarshal- এ কলগুলিতে তাদের অবজ্ঞার প্রয়োজন।
কাইল লেমনস

2

স্টিফেন ওয়েইনবার্গের উত্তরের আরও, আমি তখন থেকে আইওজসন নামক একটি কার্যকর সরঞ্জাম প্রয়োগ করেছি , যা একটি বিদ্যমান অবজেক্টে সহজেই ডেটা পপুলেটেড করতে এবং পাশাপাশি বিদ্যমান জেসসন স্ট্রিংটিতে এনকোডিং করতে সহায়তা করে। অন্যান্য মিডওয়্যারের সাথে কাজ করার জন্য একটি আইওজসন মিডলওয়্যার সরবরাহ করা হয়। আরও উদাহরণ https://github.com/junhsieh/iojson এ পাওয়া যাবে

উদাহরণ:

func main() {
    jsonStr := `{"Status":true,"ErrArr":[],"ObjArr":[{"Name":"My luxury car","ItemArr":[{"Name":"Bag"},{"Name":"Pen"}]}],"ObjMap":{}}`

    car := NewCar()

    i := iojson.NewIOJSON()

    if err := i.Decode(strings.NewReader(jsonStr)); err != nil {
        fmt.Printf("err: %s\n", err.Error())
    }

    // populating data to a live car object.
    if v, err := i.GetObjFromArr(0, car); err != nil {
        fmt.Printf("err: %s\n", err.Error())
    } else {
        fmt.Printf("car (original): %s\n", car.GetName())
        fmt.Printf("car (returned): %s\n", v.(*Car).GetName())

        for k, item := range car.ItemArr {
            fmt.Printf("ItemArr[%d] of car (original): %s\n", k, item.GetName())
        }

        for k, item := range v.(*Car).ItemArr {
            fmt.Printf("ItemArr[%d] of car (returned): %s\n", k, item.GetName())
        }
    }
}

নমুনা আউটপুট:

car (original): My luxury car
car (returned): My luxury car
ItemArr[0] of car (original): Bag
ItemArr[1] of car (original): Pen
ItemArr[0] of car (returned): Bag
ItemArr[1] of car (returned): Pen

2

অনুরূপ কাজ করার জন্য এখানে একটি মার্জিত উপায়। তবে কেন আংশিকভাবে JSON আনমর্ষাল করবেন? এটা বোঝা যায় না।

  1. চ্যাটের জন্য আপনার স্ট্রাক্ট তৈরি করুন।
  2. স্ট্রাক্টে জেসন ডিকোড করুন।
  3. এখন আপনি স্ট্রাক্ট / অবজেক্টের সমস্ত কিছু সহজেই অ্যাক্সেস করতে পারবেন।

ওয়ার্কিং কোডটি নীচে দেখুন। এটি কপি এবং পেস্ট করুন।

import (
   "bytes"
   "encoding/json" // Encoding and Decoding Package
   "fmt"
 )

var messeging = `{
"say":"Hello",
"sendMsg":{
    "user":"ANisus",
    "msg":"Trying to send a message"
   }
}`

type SendMsg struct {
   User string `json:"user"`
   Msg  string `json:"msg"`
}

 type Chat struct {
   Say     string   `json:"say"`
   SendMsg *SendMsg `json:"sendMsg"`
}

func main() {
  /** Clean way to solve Json Decoding in Go */
  /** Excellent solution */

   var chat Chat
   r := bytes.NewReader([]byte(messeging))
   chatErr := json.NewDecoder(r).Decode(&chat)
   errHandler(chatErr)
   fmt.Println(chat.Say)
   fmt.Println(chat.SendMsg.User)
   fmt.Println(chat.SendMsg.Msg)

}

 func errHandler(err error) {
   if err != nil {
     fmt.Println(err)
     return
   }
 }

খেলার মাঠে যান


4
আপনি যখন অস্থায়ী বস্তু হিসাবে কয়েক শতাধিক নেস্টেড ফিল্ডগুলির কাঠামোর সাথে কাজ করছেন তখন আংশিক আনমারশেলিং প্রয়োজনীয়। উদাহরণস্বরূপ, সার্ভার থেকে জসন পান, একক ক্ষেত্র আপডেট করুন এবং এটিকে আবার সার্ভারে পোস্ট করুন।
আর্টেম বাসকাকভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.