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


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.