如何在golang中为外部打印变量?

时间:2018-11-21 13:37:07

标签: go

我在如何在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:

enter image description here

2 个答案:

答案 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)
    }

}

Playground

答案 1 :(得分:1)

  

“不能将'DatePeriod'(类型Result)用作分配中的类型字符串”

因此,变量DatePeriodResult类型,而不是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)
}