我有一个由于各种原因无法替换的软件,并且具有一个类似于RESTFul的API。
即使RESTFul体系结构表示必须使用对象数组进行响应,所有Endpoint都可以使用一个或多个对象进行响应,即使仅找到一个对象,它也不会包装在数组中而返回对象
GET /customers?country_id=10000
{
"count": 5,
"customers": [
{ "id": 10000, "name": "Customer 10000", "vatnum": "123456789P", "country_id": 10000 },
{ "id": 10001, "name": "Customer 10001", "vatnum": "234567891P", "country_id": 10000 },
{ "id": 10002, "name": "Customer 10002", "vatnum": "345678912P", "country_id": 10000 },
{ "id": 10003, "name": "Customer 10003", "vatnum": "456789123P", "country_id": 10000 },
{ "id": 10004, "name": "Customer 10004", "vatnum": "567891234P", "country_id": 10000 }
]
}
GET /customers?vatnum=123456789P
{
"count": 1,
"customers": {
"id": 10000,
"name": "Customer 10000",
"vatnum": "123456789P",
"country_id": 10000
}
}
我的问题是我正在使用此API作为客户端,但我不知道在映射/解析Golang结构中的服务器响应方面,哪种方法是解决此问题的最佳策略。
答案 0 :(得分:1)
在使用新的API时,我经常使用此工具 https://mholt.github.io/json-to-go/ 如果您复制粘贴您的json,则可以获取自动Strut,例如:
type AutoGenerated struct {
Count int `json:"count"`
Customers struct {
ID int `json:"id"`
Name string `json:"name"`
Vatnum string `json:"vatnum"`
CountryID int `json:"country_id"`
} `json:"customers"`
}
这是单个结构,另一个结构只是该结构的一个数组。
我意识到我读错了你的问题。 https://golang.org/pkg/encoding/json/#RawMessage 先前的答案是正确的原始消息是最好的。
答案 1 :(得分:0)
type ListResponse struct{
Count int `json:"count"`
Customers []Customer `json:"customers"`
}
type Customer struct{
ID int `json:"id"`
VatNum string `json:"vatnum"`
Name string `json:"name"`
CountryId int `country_id`
}
func main(){
customer1 = Customer{1,"vat 1","name 1",1000}
customer2 = Customer{2,"vat 2","name 2",1001}
customers := make([]Customer,0,10)
customers = append(customers,customer1,customer2)
response = ListResponse{len(customers),customers}
buf,_ = json.Marshal(response)
fmt.Println(string(buf))
}