簡體   English   中英

如何在 Z5F075AE3E1F9D0382BB8C4632991F9 中將 Amazon Ion object 轉換為 JSON object?

[英]How to convert Amazon Ion object to JSON object in Go Lang?

我正在尋找一種將 Amazon Ion object 轉換為 Go Lang 中的 JSON 的方法。 這個問題是在我為 Amazon QLDB 實現 DAO 層時出現的。 到目前為止,我所做的是使用具有 json 和離子別名的 Go 結構,如下所示。

type Passport struct {
   ID      string `json:"id" ion:"id"`
   Name    string `json:"name" ion:"name"`
   Address string `json:"address" ion:"address"`
}

但我正在尋找一種在運行時將 Ion 解析為 Jason 的方法,而無需 static 結構定義。 如果您可以共享一個實用程序或現有庫來解析 ion-to-json,那就太好了。

提前致謝。

注意:我見過很少有用於 Python 和 NodeJs 的庫來解析 ion-to-json。 但我找不到 Go 的庫。

在這里,您有一個 IonToJson function 的實現以及一個測試。

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
    "testing"

    "github.com/amzn/ion-go/ion"
)

type Passport struct {
    ID      string `json:"id" ion:"id"`
    Name    string `json:"name" ion:"name"`
    Address string `json:"address" ion:"address"`
}

func IonToJson(ionBin []byte) (string, error) {
    var aMap interface{}
    err := ion.Unmarshal(ionBin, &aMap) // unmarshal from ion
    if err != nil {
        return "", fmt.Errorf("Error unmarshaling to golang %s", err)
    }
    b, err := json.Marshal(aMap)
    if err != nil {
        return "", fmt.Errorf("Error marshaling to JSON %s", err)
    }
    return string(b), nil
}

func TestION(t *testing.T) {
    aPassport := Passport{ID: "123", Name: "John", Address: "123 Main St"}
    ionbin, err := ion.MarshalBinary(aPassport) // marshal to ion
    if err != nil {
        t.Fatalf("Error marshaling %s", err)
    }

    jsonResult, err := IonToJson(ionbin)
    if err != nil {
        t.Fatalf("Error marshaling to Json %s", err)
    }

    got := jsonResult
    want := `{"id":"123","name":"John","address":"123 Main St"}`
    areEqual, err := areEqualJSON(got, want)
    if err != nil {
        t.Fatalf("Error comparing JSON %s", err)
    }
    if !areEqual {
        t.Errorf("got %s, want %s", got, want)
    }

}

func areEqualJSON(s1, s2 string) (bool, error) {
    var o1 interface{}
    var o2 interface{}

    var err error
    err = json.Unmarshal([]byte(s1), &o1)
    if err != nil {
        return false, fmt.Errorf("Error mashalling string 1 :: %s", err.Error())
    }
    err = json.Unmarshal([]byte(s2), &o2)
    if err != nil {
        return false, fmt.Errorf("Error mashalling string 2 :: %s", err.Error())
    }

    return reflect.DeepEqual(o1, o2), nil
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM