我在如何在Go中为外部打印变量时遇到问题? 我正在使用库GJSON gjson
我已经尝试了很多方法,我只是输入了全局变量,但只是出现了最终索引, 喜欢:
datePriodGlobal = DatePeriod.String()
和
datePriodGlobal = DatePeriod.String()
我尝试的另一种方法,但也只显示最终索引,如下所示:
tempPayments:= "Envelope.Body.GetCustomReportResponse.GetCustomReportResult.ContractSummary.PaymentCalendarList.PaymentCalendar."
resultMapPriodTest := gjson.Get(jsonString,tempPayments + "#.Date")
resultContractsSubmittedTest := gjson.Get(jsonString, tempPayments + "#.ContractsSubmitted")
var datePriodGlobal string
for _, DatePeriod := range resultMapPriodTest.Array()[1:13] {
datePriodGlobal = fmt.Sprintf("%s", DatePeriod.String())
}
var contractsSubmittedGlobal string
for _, ContractsSubmitted := range resultContractsSubmittedTest.Array()[1:13]{
contractsSubmittedGlobal = fmt.Sprintf("%s", ContractsSubmitted.String())
}
fmt.Printf("%s | %s \t|",datePriodGlobal, contractsSubmittedGlobal)
}
我有这样的json:
答案 0 :(得分:2)
我建议仅将PaymentCalendar
作为JSON对象切片进行迭代,而不是使用索引作为其伪ID来查询每个字段。
这是一个简单的演示:
func main() {
jsonString := `
{
"PaymentCalendarList": {
"PaymentCalendar": [
{"ContractSubmitted": 10,
"Date": "2018-01-01T01:01:01"},
{"ContractSubmitted": 20,
"Date": "2018-01-01T02:02:02"},
{"ContractSubmitted": 30,
"Date": "2018-01-01T03:03:03"}
{"ContractSubmitted": 40,
"Date": "2018-01-01T04:04:04"}
{"ContractSubmitted": 50,
"Date": "2018-01-01T05:05:05"}
]
}
}`
result := gjson.Get(jsonString, "PaymentCalendarList.PaymentCalendar")
for _, paymentCal := range result.Array()[0:3] {
date := paymentCal.Get("Date")
contractSubmit := paymentCal.Get("ContractSubmitted")
fmt.Printf("%s | %s\n", date, contractSubmit)
}
}
答案 1 :(得分:1)
“不能将'DatePeriod'(类型Result)用作分配中的类型字符串”
因此,变量DatePeriod
是Result
类型,而不是String
。您指定要使用%s
打印一个字符串,但不给fmt.Sprintf
一个字符串,从而导致该错误。如果给定的值已经是Sprintf
,则String
是不必要的。
从gjson.go看,Result
类型有一个String()
方法,所以您想使用DatePeriod.String()
。
编辑:
从您的最新编辑来看,我想我看到了您的第二期。您的循环每次都会替换...Global
字符串变量,因此,您只会获得传递给range
的切片中的最后一个值。由于您的切片长度相同,因此使用以下方法可能会更好:
resultMapPriodTest := gjson.Get(jsonString,tempPayments + "#.Date")
resultContractsSubmittedTest := gjson.Get(jsonString, tempPayments + "#.ContractsSubmitted")
dateArray := resultMapPriodTest.Array()[1:13]
contractsArray := resultContractsSubmittedTest.Array()[1:13]
for i := 0; i<len(dateArray); i++ {
d := dateArray[i].String()
c := contractsArray[i].String()
fmt.Printf("%s | %s \t|", d, c)
}