আনমারশেলিং নেস্টেড জেএসওএন অবজেক্ট


122

আছে একটি কয়েক প্রশ্ন উপর বিষয় কিন্তু তাদের কেউ এইভাবে আমি নতুন একটি তৈরি করছি, আমার ক্ষেত্রে আবরণ বলে মনে হচ্ছে।

আমি নিম্নলিখিত মত JSON আছে:

{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}

নেস্টেড বারের সম্পত্তিটি নিখরচায় করার জন্য এবং নেস্টেড স্ট্রাক্ট তৈরি না করে সরাসরি কোনও স্ট্রাক্ট সম্পত্তিতে এটি নির্ধারণ করার কোনও উপায় আছে কি?

আমি এখনই সমাধানটি গ্রহণ করছি:

type Foo struct {
    More String `json:"more"`
    Foo  struct {
        Bar string `json:"bar"`
        Baz string `json:"baz"`
    } `json:"foo"`
    //  FooBar  string `json:"foo.bar"`
}

এটি একটি সরলীকৃত সংস্করণ, দয়া করে ভার্বোসটি উপেক্ষা করুন। যেমন আপনি দেখতে পাচ্ছেন, আমি পার্স করতে এবং মানটি নির্ধারণ করতে সক্ষম হতে চাই

//  FooBar  string `json:"foo.bar"`

আমি লোককে মানচিত্র ব্যবহার করতে দেখেছি, তবে এটি আমার ঘটনা নয়। আমি fooকয়েকটি নির্দিষ্ট উপাদান ব্যতীত মূলত (যা একটি বৃহত অবজেক্ট) এর সামগ্রীর বিষয়ে চিন্তা করি না ।

এক্ষেত্রে সঠিক পন্থাটি কী? আমি অদ্ভুত হ্যাকের সন্ধান করছি না, এভাবে যদি এভাবে চলতে হয় তবে আমি ঠিক আছি।

উত্তর:


67

নেস্টেড বারের সম্পত্তিটি নিখরচায় করার জন্য এবং নেস্টেড স্ট্রাক্ট তৈরি না করে সরাসরি কোনও স্ট্রাক্ট সম্পত্তিতে এটি নির্ধারণ করার কোনও উপায় আছে কি?

না, এনকোডিং / এক্সএমএল যেমন "> কিছু> গভীর> চাইল্ডনোড" দিয়ে কৌতুকটি করতে পারে না এনকোডিং / জসন। নেস্টেড স্ট্রাইকগুলি হ'ল উপায়।


1
এটি এনকোডিং / এক্সএমএল এর চেয়ে আলাদা কেন?
কালেব হের্থ

1
@ ক্যালাবেথহম্পসন এক্সএমএল এবং জেএসওএন-এর কাঠামো সম্পূর্ণ ভিন্ন, এমনকি যদি সাধারণ ক্ষেত্রেগুলি একই রকম দেখায়। একটি এক্সএমএল ট্যাগের বিষয়বস্তু দয়ালু: (উপ-ট্যাগ বা পাঠ্যের একটি আদেশযুক্ত মানচিত্র) এবং গুণাবলীর একটি নিরবচ্ছিন্ন মানচিত্র। জেএসএন অনেকটা গো স্ট্রাক্টের মতো। সুতরাং JSON কে স্ট্রকেটে ম্যাপ করা অনেক সহজ: আপনার JSON এর পরে কেবল কাঠামোর মডেল করুন।
ভোলকার

আমার ক্ষেত্রে জেএসএনের কাঠামোটি আসলে সিদ্ধান্ত হয় না তাই আমি একটি কাঠামো তৈরি করতে পারি এবং যখন আমি [স্ট্রিং] ইন্টারফেসের মানচিত্র using using ব্যবহার করে এটি বিশ্লেষণ করি তখন নেস্টেড উপাদানগুলির জন্য আমার সমস্যা হয়। কি করা যেতে পারে.?
Viveksinghggits

কিন্তু কেন আমরা স্ট্রাক্টের অভ্যন্তরে কাঠামো আনমারশাল করতে পারি না?
ভাইটালি জাদানেভিচ

29

ভোলকার যা উল্লেখ করেছেন তার মতো, নেস্টেড স্ট্রাইকগুলি হ'ল উপায়। তবে যদি আপনি সত্যিই নেস্টেড স্ট্রাইকগুলি না চান, আপনি আনমারশাল জেএসএন ফানকে ওভাররাইড করতে পারেন।

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

type A struct {
    FooBar string // takes foo.bar
    FooBaz string // takes foo.baz
    More   string 
}

func (a *A) UnmarshalJSON(b []byte) error {

    var f interface{}
    json.Unmarshal(b, &f)

    m := f.(map[string]interface{})

    foomap := m["foo"]
    v := foomap.(map[string]interface{})

    a.FooBar = v["bar"].(string)
    a.FooBaz = v["baz"].(string)
    a.More = m["more"].(string)

    return nil
}

দয়া করে এই বিষয়টি উপেক্ষা করুন যে আমি কোনও সঠিক ত্রুটি ফিরিয়ে দিচ্ছি না। আমি সরলতার জন্য এটি ছেড়ে দিয়েছি।

আপডেট: সঠিকভাবে "আরও" মান পুনরুদ্ধার করা।


3
আমি & oo ফুবার: 1 টি ফুবাজ: 2 আরও: getting পাচ্ছি} "পাঠ্য" অনুপস্থিত
গাই সেজেভ

@ গুয়াসেগেভ আমি এই সমস্যাটি সমাধান করতে আমার উত্তর আপডেট করেছিলাম updated যে ইশারা জন্য ধন্যবাদ।
রেফপোসাদাস

22

নিরাপদ ব্রাউজিং ভি 4 এপিআই এসবসভার প্রক্সি সার্ভারের জেএসএন প্রতিক্রিয়াগুলি কীভাবে মুক্ত করতে হবে তার একটি উদাহরণ: https://play.golang.org/p/4rGB5da0Lt

// this example shows how to unmarshall JSON requests from the Safebrowsing v4 sbserver
package main

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

// response from sbserver POST request
type Results struct {
    Matches []Match     
}

// nested within sbserver response
type Match struct {
    ThreatType string 
    PlatformType string 
    ThreatEntryType string 
    Threat struct {
        URL string
    }
}

func main() {
    fmt.Println("Hello, playground")

    // sample POST request
    //   curl -X POST -H 'Content-Type: application/json' 
    // -d '{"threatInfo": {"threatEntries": [{"url": "http://testsafebrowsing.appspot.com/apiv4/ANY_PLATFORM/MALWARE/URL/"}]}}' 
    // http://127.0.0.1:8080/v4/threatMatches:find

    // sample JSON response
    jsonResponse := `{"matches":[{"threatType":"MALWARE","platformType":"ANY_PLATFORM","threatEntryType":"URL","threat":{"url":"http://testsafebrowsing.appspot.com/apiv4/ANY_PLATFORM/MALWARE/URL/"}}]}`

    res := &Results{}
    err := json.Unmarshal([]byte(jsonResponse), res)
        if(err!=nil) {
            log.Fatal(err)
        }

    fmt.Printf("%v\n",res)
    fmt.Printf("\tThreat Type: %s\n",res.Matches[0].ThreatType)
    fmt.Printf("\tPlatform Type: %s\n",res.Matches[0].PlatformType)
    fmt.Printf("\tThreat Entry Type: %s\n",res.Matches[0].ThreatEntryType)
    fmt.Printf("\tURL: %s\n",res.Matches[0].Threat.URL)
}

2
দেখাচ্ছে যে json.Unmarshal জন্য ধন্যবাদ পারেন একটি জটিল গভীরভাবে নেস্টেড JSON তথ্য unmarshal। আমার সমস্যাটি ছিল আমি একটি ফাইল থেকে জেএসএন পড়ছিলাম এবং কিছু শূন্য প্যাডিংয়ের সাথে শেষ করেছি। খুশী হয়ে আপনি এ ভাগ করেছেন!
রোহান্তেজাইজ

12

হ্যাঁ. সঙ্গে gjson সব এখন যা করতে হবে:

bar := gjson.Get(json, "foo.bar")

barআপনি যদি চান একটি কাঠামো সম্পত্তি হতে পারে। এছাড়াও, কোনও মানচিত্র নেই।


1
fastjson একই কৌতুক অনুমতি দেয়: fastjson.GetString(json, "foo", "bar")
valyala

9

নামবিহীন ক্ষেত্র সম্পর্কে কী? আমি নিশ্চিত নই যে এটি "নেস্টেড স্ট্রাক্ট" গঠন করবে কিনা তবে এটি নেস্টেড স্ট্রাক্ট ঘোষণার চেয়ে পরিষ্কার। আপনি যদি নেস্টেড উপাদানটি অন্য কোথাও আবার ব্যবহার করতে চান?

type NestedElement struct{
    someNumber int `json:"number"`
    someString string `json:"string"`
}

type BaseElement struct {
    NestedElement `json:"bar"`
}

1

jsonযতক্ষণ না আপনি জেসন কীগুলির অন্তর্নিহিত প্রকারটি জেনে থাকেন ততক্ষণ নেস্টেড মানগুলিকে নির্ধারণ করুন : -

package main

import (
    "encoding/json"
    "fmt"
)

// Object
type Object struct {
    Foo map[string]map[string]string `json:"foo"`
    More string `json:"more"`
}

func main(){
    someJSONString := []byte(`{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}`)
    var obj Object
    err := json.Unmarshal(someJSONString, &obj)
    if err != nil{
        fmt.Println(err)
    }
    fmt.Println("jsonObj", obj)
}

0

আমি এরকম কিছু নিয়ে কাজ করছিলাম। তবে কেবল প্রোটো থেকে উত্পন্ন কাঠামো নিয়েই কাজ করছে। https://github.com/flowup-labs/grpc-utils

আপনার প্রোটোতে

message Msg {
  Firstname string = 1 [(gogoproto.jsontag) = "name.firstname"];
  PseudoFirstname string = 2 [(gogoproto.jsontag) = "lastname"];
  EmbedMsg = 3  [(gogoproto.nullable) = false, (gogoproto.embed) = true];
  Lastname string = 4 [(gogoproto.jsontag) = "name.lastname"];
  Inside string  = 5 [(gogoproto.jsontag) = "name.inside.a.b.c"];
}

message EmbedMsg{
   Opt1 string = 1 [(gogoproto.jsontag) = "opt1"];
}

তাহলে আপনার আউটপুট হবে

{
"lastname": "Three",
"name": {
    "firstname": "One",
    "inside": {
        "a": {
            "b": {
                "c": "goo"
            }
        }
    },
    "lastname": "Two"
},
"opt1": "var"
}

2
এটি কীভাবে প্রশ্নের উত্তর দেয় তা বোঝাতে কয়েকটি লাইন যুক্ত করুন। রেপো যদি মুছে ফেলা হয় তবে উত্তরের কোনও মান নেই।
উবারকুল

আমার মনে হয় না সে ফিরে আসবে, সাথীরা।
ডেভএক্স

-1

মানচিত্র এবং কাঠামোর সংমিশ্রণে নেস্টেড জেএসওএন অবজেক্টগুলিকে নিখরচায়িত করার অনুমতি দেয় যেখানে কীটি গতিশীল। => মানচিত্র [স্ট্রিং]

উদাহরণস্বরূপ: stock.json

{
  "MU": {
    "symbol": "MU",
    "title": "micro semiconductor",
    "share": 400,
    "purchase_price": 60.5,
    "target_price": 70
  },
  "LSCC":{
    "symbol": "LSCC",
    "title": "lattice semiconductor",
    "share": 200,
    "purchase_price": 20,
    "target_price": 30
  }
}

অ্যাপ্লিকেশন যান

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

type Stock struct {
    Symbol        string  `json:"symbol"`
    Title         string  `json:"title"`
    Share         int     `json:"share"`
    PurchasePrice float64 `json:"purchase_price"`
    TargetPrice   float64 `json:"target_price"`
}
type Account map[string]Stock

func main() {
    raw, err := ioutil.ReadFile("stock.json")
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }
    var account Account
    log.Println(account)
}

হ্যাশের গতিশীল কীটি একটি স্ট্রিং পরিচালনা করে এবং নেস্টেড অবজেক্টটি স্ট্রাক্ট দ্বারা প্রতিনিধিত্ব করা হয়।


3
এটি অসম্পূর্ণ বলে মনে হচ্ছে। কাঁচা অব্যবহৃত
বিল্ডমাস্ট্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.