[英]How to convert Amazon Ion file to JSON format using Python?
[英]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.