gpt4 book ai didi

json - 将不断变化的类型流解码为结构

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:49 24 4
gpt4 key购买 nike

我目前正在处理进入我的应用程序的 json 对象流,并且在确定解析它们的最佳方法时遇到了一些困难。流由具有定义类型的对象组成。问题是对象中的字段之一是更改类型。它看起来像这样:

[{
"status": "closed",
"type": "transaction",
"transaction": {
"TransactionType": "TypeA",
"Account": "Some string",
"Fee": "14",
"date": 45325680
},
"validated": true
},

{
"status": "closed",
"type": "transaction",
"transaction": {
"TransactionType" : "TypeB",
"Account" : "Some string",
"Fee": "42",
"Destination" : "Some string"
},
"validated": true
}]

可以看到“父”没有变,但是“事务”变了。我从“交易”字段中删除了很多字段,以便于解释,但这是一个具有 10 个公共(public)字段和 10 个依赖于该类型的更改字段的类型。还有 10 种交易类型,这使得将所有内容放入一个结构并拥有大量可选字段变得非常烦人。我也在考虑为每种交易类型使用一个结构,但这不起作用,因为这样就无法指定该字段在父级中应具有哪种类型。

我将如何有效地解析这些对象?不幸的是,我无法更改从流中出来的元素的结构。解决此问题的最佳方法是什么?

最佳答案

或许将您的交易保留为map[string]interface{}

示例 https://play.golang.com/p/j_u_ztw04M

package main

import (
"encoding/json"
"fmt"
)

type Stream []struct {
Status string `json:"status"`
Type string `json:"type"`

// map instead of struct
Transaction map[string]interface{} `json:"transaction"`

Validated bool `json:"validated"`
}

func main() {

stream := Stream{}

err := json.Unmarshal(rawj, &stream)
if err != nil {
fmt.Println("error:", err)
return
}

for i, s := range stream {
fmt.Println("thing:", i)
for k, v := range s.Transaction {

// do manual stuff here, perhaps long switch on k and/or
// as suggested by Cerise Limón type switch on v
fmt.Printf("key: %s, val: %v, val type: %T\n", k, v, v)

}
fmt.Println()
}

}

var rawj = []byte(`[{
"status": "closed",
"type": "transaction",
"transaction": {
"TransactionType": "TypeA",
"Account": "Some string",
"Fee": "14",
"date": 45325680
},
"validated": true
},

{
"status": "closed",
"type": "transaction",
"transaction": {
"TransactionType" : "TypeB",
"Account" : "Some string",
"Fee": "42",
"Destination" : "Some string"
},
"validated": true
}]`)

玩得开心!

关于json - 将不断变化的类型流解码为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47779354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com