আমি কীভাবে জেএসওএন ব্যবহার করে প্রিন্ট করতে পারি?


191

গো-এ জেএসএন আউটপুট প্রিন্ট করার কোনও সহজ উপায় কি কেউ জানেন?

স্টক http://golang.org/pkg/encoding/json/ প্যাকেজটির জন্য কার্যকারিতা অন্তর্ভুক্ত বলে মনে হচ্ছে না (সম্পাদনা: এটি করে, গৃহীত উত্তর দেখুন) এবং একটি দ্রুত গুগল সুস্পষ্ট কিছু আপ করে না।

আমি যে ব্যবহারগুলি সন্ধান করছি সেগুলি ফলাফলের প্রিন্টিং-ছাপানো json.Marshalএবং যে কোনও জায়গা থেকে কেবল JSON পূর্ণ স্ট্রিংকে ফরম্যাট করা, যাতে ডিবাগের উদ্দেশ্যে পড়া সহজ।


সতর্কতা: আমার পরীক্ষায়, JSON অভিধানে স্ট্রিং সূচকগুলি অবশ্যই বন্ধনীতে আবদ্ধ থাকতে হবে । সুতরাং, বেশিরভাগ জাভাস্ক্রিপ্ট দোভাষী এটি ব্যবহার করেও{name: "value"} ঠিক হবে না । শুধুমাত্র গো জেএসএন লাইব্রেরি ফাংশন নিয়ে কাজ করবে। {"name": "value"}
— পিটারহ - মনিকা

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

উত্তর:


295

প্রিন্ট-প্রিন্ট দ্বারা, আমি ধরে নিচ্ছি আপনি যেমন ইন্ডেন্টড মানে, তেমনই

{
    "data": 1234
}

বরং

{"data":1234}

এটি করার সবচেয়ে সহজ উপায় হ'ল MarshalIndentএটি আপনাকে indentআর্গুমেন্টের মাধ্যমে কীভাবে ইন্ডেন্ট করতে চাইবে তা নির্দিষ্ট করতে দেয় । সুতরাং, json.MarshalIndent(data, "", " ")ইন্ডেন্টেশনের জন্য চারটি স্পেস ব্যবহার করে প্রিন্ট করবে।


17
হ্যাঁ, এটি দেখতে কেবল জিনিসটির মতোই - এটি ইতিমধ্যে অন্তর্নির্মিত, কেবল বামটি হল পিকিজি ডকটিতে "চমত্কার-মুদ্রণ" কীওয়ার্ডটি অন্তর্ভুক্ত করা যাতে পরের লোকটি অনুসন্ধান করে এটি সন্ধান করে। (ডক রক্ষণাবেক্ষণকারীদের জন্য একটি প্রতিক্রিয়া নোট ছেড়ে দেবে)) টি!
— ব্র্যাড পিবডি

38
json.MarshalIndent(data, "", "\t")আপনি যদি ট্যাব চান।
— কাইল ব্র্যান্ডেট

78
json.MarshalIndent(data, "", "🐱")আপনি যদি বিড়াল চান। দুঃখিত
— BriiC

44
json.MarshalIndent(data, "", "\t🐱")যদি আপনি চান তাহলে ... বাদামী রঙের বিড়াল ... দুঃখিত
— দাভোসে

78

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

ব্যবহার করতে MarshalIndent, আপনি এটি Unmarshalএকটি বস্তুর মধ্যে করতে হবে । আপনার যদি এটির প্রয়োজন হয় তবে এটির জন্য যান, কিন্তু আমি তা করিনি। আপনার যদি কেবল একটি বাইট অ্যারে চমত্কার-মুদ্রণের প্রয়োজন হয় তবে সাধারণ Indentআপনার বন্ধু।

আমি এখানে যা শেষ করেছি তা এখানে:

import (
    "bytes"
    "encoding/json"
    "log"
    "net/http"
)

func HandleCSPViolationRequest(w http.ResponseWriter, req *http.Request) {
    body := App.MustReadBody(req, w)
    if body == nil {
        return
    }

    var prettyJSON bytes.Buffer
    error := json.Indent(&prettyJSON, body, "", "\t")
    if error != nil {
        log.Println("JSON parse error: ", error)
        App.BadRequest(w)
        return
    }

    log.Println("CSP Violation:", string(prettyJSON.Bytes()))
}

48

মেমরির আরও ভাল ব্যবহারের জন্য, আমার ধারণা এটি আরও ভাল:

var out io.Writer
enc := json.NewEncoder(out)
enc.SetIndent("", "    ")
if err := enc.Encode(data); err != nil {
    panic(err)
}

কি SetIndentপেতে সম্প্রতি যোগ করা? এটি মূলত বেশিরভাগেরই অজানা।
— chappjc

1
@chappjc SetIndent(মূল নামকরণ Indent) স্পষ্টত মার্চ ২০১ 2016 যোগ করা হয়েছিল এবং গো ১.7 এ প্রকাশিত হয়েছিল, যা এই প্রশ্নটি জিজ্ঞাসা করার প্রায় 3 বছর পরে ছিল: github.com/golang/go/commit/… github.com/golang/go/commit/ …
— এওইউ

20

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

এটির সাহায্যে আপনি খুব সামান্য কোড ব্যবহার করে সহজেই এরূপ আউটপুট উত্পাদন করতে পারেন:

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

package main

import (
    "fmt"
    "encoding/json"

    "github.com/TylerBrock/colorjson"
)

func main() {
    str := `{
      "str": "foo",
      "num": 100,
      "bool": false,
      "null": null,
      "array": ["foo", "bar", "baz"],
      "obj": { "a": 1, "b": 2 }
    }`

    var obj map[string]interface{}
    json.Unmarshal([]byte(str), &obj)

    // Make a custom formatter with indent set
    f := colorjson.NewFormatter()
    f.Indent = 4

    // Marshall the Colorized JSON
    s, _ := f.Marshal(obj)
    fmt.Println(string(s))
}

আমি এখন এটির জন্য ডকুমেন্টেশন লিখছি তবে আমি আমার সমাধানটি ভাগ করে নিতে আগ্রহী।


17

সম্পাদনা করুন খুঁজছি পিছনে, এই অ কথ্য হয় যান। এর মতো ছোট সহায়ক ফাংশন জটিলতার একটি অতিরিক্ত পদক্ষেপ যুক্ত করে। সাধারণভাবে, Go দর্শন 1 টি জটিল লাইনের ওপরে 3 টি সাধারণ লাইন অন্তর্ভুক্ত করতে পছন্দ করে।


@ রবিওডার যেমন উল্লেখ করেছেন, json.Indentযাওয়ার উপায়। ভেবেছিলাম আমি এই ছোট prettyprintফাংশনটি যুক্ত করব:

package main

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

//dont do this, see above edit
func prettyprint(b []byte) ([]byte, error) {
    var out bytes.Buffer
    err := json.Indent(&out, b, "", "  ")
    return out.Bytes(), err
}

func main() {
    b := []byte(`{"hello": "123"}`)
    b, _ = prettyprint(b)
    fmt.Printf("%s", b)
}

https://go-sandbox.com/#/R4LWpkkHIN বা http://play.golang.org/p/R4LWpkkHIN


7

আমি যা ব্যবহার করি তা এখানে। এটি JSON প্রিন্ট করতে অসফল হলে এটি কেবল আসল স্ট্রিংটি দেয়। এইচটিটিপি প্রতিক্রিয়াগুলি মুদ্রণের জন্য দরকারী যা জেএসওএন থাকা উচিত ।

import (
    "encoding/json"
    "bytes"
)

func jsonPrettyPrint(in string) string {
    var out bytes.Buffer
    err := json.Indent(&out, []byte(in), "", "\t")
    if err != nil {
        return in
    }
    return out.String()
}


2

গো-এ গোপনে প্রিন্টারের বাইরে একটি সহজ। এটির মাধ্যমে কেউ বাইনারি সংকলন করতে পারে:

go build -o jsonformat jsonformat.go

এটি স্ট্যান্ডার্ড ইনপুট থেকে পড়ে, স্ট্যান্ডার্ড আউটপুট লিখে এবং ইনডেন্টেশন সেট করার অনুমতি দেয়:

package main

import (
    "bytes"
    "encoding/json"
    "flag"
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    indent := flag.String("indent", "  ", "indentation string/character for formatter")
    flag.Parse()
    src, err := ioutil.ReadAll(os.Stdin)
    if err != nil {
        fmt.Fprintf(os.Stderr, "problem reading: %s", err)
        os.Exit(1)
    }

    dst := &bytes.Buffer{}
    if err := json.Indent(dst, src, "", *indent); err != nil {
        fmt.Fprintf(os.Stderr, "problem formatting: %s", err)
        os.Exit(1)
    }
    if _, err = dst.WriteTo(os.Stdout); err != nil {
        fmt.Fprintf(os.Stderr, "problem writing: %s", err)
        os.Exit(1)
    }
}

এটি যেমন বাশ কমান্ডগুলি চালানোর অনুমতি দেয়:

cat myfile | jsonformat | grep "key"

2
package cube

import (
    "encoding/json"
    "fmt"
    "github.com/magiconair/properties/assert"
    "k8s.io/api/rbac/v1beta1"
    v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "testing"
)

func TestRole(t *testing.T)  {
    clusterRoleBind := &v1beta1.ClusterRoleBinding{
        ObjectMeta: v1.ObjectMeta{
            Name: "serviceaccounts-cluster-admin",
        },
        RoleRef: v1beta1.RoleRef{
            APIGroup: "rbac.authorization.k8s.io",
            Kind:     "ClusterRole",
            Name:     "cluster-admin",
        },
        Subjects: []v1beta1.Subject{{
            Kind:     "Group",
            APIGroup: "rbac.authorization.k8s.io",
            Name:     "system:serviceaccounts",
        },
        },
    }
    b, err := json.MarshalIndent(clusterRoleBind, "", "  ")
    assert.Equal(t, nil, err)
    fmt.Println(string(b))
}

ইহা কেমন দেখতে


1

আমি যেতে নতুন ধরণের, কিন্তু আমি এ পর্যন্ত এটি একত্রিত:

package srf

import (
    "bytes"
    "encoding/json"
    "os"
)

func WriteDataToFileAsJSON(data interface{}, filedir string) (int, error) {
    //write data as buffer to json encoder
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetIndent("", "\t")

    err := encoder.Encode(data)
    if err != nil {
        return 0, err
    }
    file, err := os.OpenFile(filedir, os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        return 0, err
    }
    n, err := file.Write(buffer.Bytes())
    if err != nil {
        return 0, err
    }
    return n, nil
}

এটি ফাংশনটির সম্পাদন এবং কেবলমাত্র মান

b, _ := json.MarshalIndent(SomeType, "", "\t")

কোড:

package main

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

    minerals "./minerals"
    srf "./srf"
)

func main() {

    //array of Test struct
    var SomeType [10]minerals.Test

    //Create 10 units of some random data to write
    for a := 0; a < 10; a++ {
        SomeType[a] = minerals.Test{
            Name:   "Rand",
            Id:     123,
            A:      "desc",
            Num:    999,
            Link:   "somelink",
            People: []string{"John Doe", "Aby Daby"},
        }
    }

    //writes aditional data to existing file, or creates a new file
    n, err := srf.WriteDataToFileAsJSON(SomeType, "test2.json")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("srf printed ", n, " bytes to ", "test2.json")

    //overrides previous file
    b, _ := json.MarshalIndent(SomeType, "", "\t")
    ioutil.WriteFile("test.json", b, 0644)

}

0
//You can do it with json.MarshalIndent(data, "", "  ")

package main

import(
  "fmt"
  "encoding/json" //Import package
)

//Create struct
type Users struct {
    ID   int
    NAME string
}

//Asign struct
var user []Users
func main() {
 //Append data to variable user
 user = append(user, Users{1, "Saturn Rings"})
 //Use json package the blank spaces are for the indent
 data, _ := json.MarshalIndent(user, "", "  ")
 //Print json formatted
 fmt.Println(string(data))
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.