我正在使用Go和Yahoo API构建股票报价网络应用。
问题是如何在数组和单个结构之间切换而无需编写另一个结构。我不确定如何用语言解释它。这是示例:
从Yahoo API获得一个符号引号如下所示:
{"query":{"count":1,"created":"2016-05-11T02:12:33Z","lang":"en-US","results":{"quote":{"Change":"+0.21","DaysLow":"9.32","DaysHigh":"9.68","Name":"Alcoa Inc. Common Stock","Open":"9.56","PreviousClose":"9.46","Symbol":"aa","Volume":"22266533","PercentChange":"+2.22%"}}}}
从Yahoo API获取多个报价:
{"query":{"count":2,"created":"2016-05-11T02:17:48Z","lang":"en-us","results":{"quote":[{"Change":"+0.21","DaysLow":"9.32","DaysHigh":"9.68","Name":"Alcoa Inc. Common Stock","Open":"9.56","PreviousClose":"9.46","Symbol":"aa","Volume":"22266533","PercentChange":"+2.22%"},{"Change":"+0.63","DaysLow":"92.11","DaysHigh":"93.57","Name":"Apple Inc.","Open":"93.35","PreviousClose":"92.79","Symbol":"aapl","Volume":"33686836","PercentChange":"+0.68%"}]}}}
不同之处在于引号成为一个数组[]
。
使用时如何处理json.Unmarshal(quoteResultRawJSON, &queryResult)
?
我的结构看起来像:
type QueryResult struct {
Id bson.ObjectId `bson:"_id,omitempty"`
Query Query `json:"query"`
}
type Query struct {
Count int `json:"count"`
Created string `json:"created"`
Lang string `json:"lang"`
Results Quote `json:"results"`
}
type Quote struct {
Quote StockQuote `json:"quote"` //Here is the difference. Do I need to re-write the whole struct in order to handle []
}
type StockQuote struct {
Change string `json:"change"`
PercentChange string `json:"percentChange"`
DaysLow string `json:"daysLow"`
DaysHigh string `json:"daysHigh"`
Open string `json:"open"`
PreviousClose string `json:"previousClose"`
Symbol string `json:"symbol"`
Name string `json:"name"`
Volume string `json:"volume"`
}
我是否需要编写另一个结构来处理数组?
通过UnmarshalJSON()
覆盖控制解组过程。
https://play.golang.org/p/pCSgymQYC3
package main
import (
"log"
"encoding/json"
"bytes"
)
const(
s1=`{"query":{"count":1,"created":"2016-05-11T02:12:33Z","lang":"en-US","results":{"quote":{"Change":"+0.21","DaysLow":"9.32","DaysHigh":"9.68","Name":"Alcoa Inc. Common Stock","Open":"9.56","PreviousClose":"9.46","Symbol":"aa","Volume":"22266533","PercentChange":"+2.22%"}}}}`
s2=`{"query":{"count":2,"created":"2016-05-11T02:17:48Z","lang":"en-us","results":{"quote":[{"Change":"+0.21","DaysLow":"9.32","DaysHigh":"9.68","Name":"Alcoa Inc. Common Stock","Open":"9.56","PreviousClose":"9.46","Symbol":"aa","Volume":"22266533","PercentChange":"+2.22%"},{"Change":"+0.63","DaysLow":"92.11","DaysHigh":"93.57","Name":"Apple Inc.","Open":"93.35","PreviousClose":"92.79","Symbol":"aapl","Volume":"33686836","PercentChange":"+0.68%"}]}}}`
)
type QueryResult struct {
//Id bson.ObjectId `bson:"_id,omitempty"`
Query Query `json:"query"`
}
type Query struct {
Count int `json:"count"`
Created string `json:"created"`
Lang string `json:"lang"`
Results Quote `json:"results"`
}
type structOrArray struct{
parent *Quote
s StockQuote
a []StockQuote
}
func (this *structOrArray)UnmarshalJSON(data []byte) error{
d := json.NewDecoder(bytes.NewBuffer(data))
t, err := d.Token();
if err != nil{
return err
}
if t==json.Delim('['){
if err := json.Unmarshal(data, &this.a);err != nil {
return err
}
return nil
}
if err := json.Unmarshal(data, &this.s);err != nil {
return err
}
return nil
}
type fakeQuote struct{
Load structOrArray `json:"quote"` //Here is the difference. Do I need to re-write the whole struct in order to handle []
}
type Quote struct {
Quote *StockQuote
Quotes []StockQuote
}
func (this *Quote)UnmarshalJSON(data []byte) error{
fq := fakeQuote{}
if err := json.Unmarshal(data, &fq);err != nil{
return err
}
this.Quote = &fq.Load.s
this.Quotes = fq.Load.a
return nil
}
type StockQuote struct {
Change string `json:"change"`
PercentChange string `json:"percentChange"`
DaysLow string `json:"daysLow"`
DaysHigh string `json:"daysHigh"`
Open string `json:"open"`
PreviousClose string `json:"previousClose"`
Symbol string `json:"symbol"`
Name string `json:"name"`
Volume string `json:"volume"`
}
func main() {
r := QueryResult{}
err := json.Unmarshal([]byte(s1), &r)
if err != nil {
log.Fatalln(err)
}
log.Println(r.Query.Results.Quote)
log.Println(r.Query.Results.Quotes)
err = json.Unmarshal([]byte(s2), &r)
if err != nil {
log.Fatalln(err)
}
log.Println(r.Query.Results.Quote)
log.Println(r.Query.Results.Quotes)
}
我试图实现事件处理函数,以避免每次组件和时创建新函数。 场景1: 如果我像下面那样在构造函数中绑定函数,并且在中没有参数,那么它只会在bundle文件中创建一个新函数一次 场景2: 但是,当我想将以及传递给函数时,我相信每当组件和 所以 如何更好地编写场景2,使新函数在bundle文件中只创建一次,而不是每次组件渲染和重新渲染时都创建一次?可能吗? 编辑: param1和param2是我自己的自定
问题内容: 我得到了一种用于创建,读取,更新和删除的表单。我用相同的形式创建了3个组件,但它们传递了不同的道具。我得到了CreateForm.js,ViewForm.js(带有删除按钮的只读)和UpdateForm.js。 我以前使用过PHP,所以我总是以一种形式进行操作。 我使用React和Redux来管理商店。 当我进入CreateForm组件时,我将这些道具传递给子组件,以使其不使用值填充输
我最近看到我的朋友编写的一个 类有很多方法。该类与图像有关,并且具有诸如 我问他为什么要使用。我知道编译器会更改 到 他只是说,它减少了对函数的调用,并且只在实用程序方法上使用它们。每次复制相同的代码不会增加程序大小吗? 现在需要这个吗?如果需要,应该在什么时候使用它们? 编辑 我在Patrick提供的一个列表中列出了大多数问题和优点,以帮助那些不想浏览链接的未来观众。 问题 用扩展的函数体替换调
问题内容: 什么是最好的Java图像处理库/方法?[关闭]我同时使用JAI媒体API和ImageMagick吗? ImageMagick存在一些可伸缩性问题,基于JNI的JMagick也没有吸引力。与ImageMagick相比,JAI执行大小调整操作时的质量结果较差。 有谁知道过任何出色的开源或商业工具,它们都是本机Java并可以提供高质量的结果? 问题答案: 我知道这个问题已经很老了,但是随着新
问题内容: 我正在使用Java和Swing应用程序框架开发桌面应用程序。我有一个关于box的应用程序,我希望该box包含一些有关正在测试哪个版本的指示。我希望该值可以自动更改。我正在使用CruiseControl构建从SVN提交触发的应用程序。 他人使用什么机制来完成这项工作?是否有一个关于Box版本号的库或一组与蚂蚁相关的工具,我可以在构建过程中使用它们? 我不是在寻找部署选项,也不是在寻找自动
我刚刚开发了一个Android应用程序(MINSDKVersion23/TargetSDKVersion29),它可以连接到BluetoothLE设备以定期获取数据。 现在,在MainActivity(不是第一个活动)中,我执行以下注册BroadcastReciever的操作: 当设备连接/发现/datareCieved时执行的所有回调都在StatusActivity中,而不是在BleServic