Как напечатать переменную для, снаружи, для Голанга? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть проблема, как напечатать переменную для, снаружи, в 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 голосов
/ 21 ноября 2018

Я предлагаю просто перебрать PaymentCalendar в виде фрагмента объектов JSON, а не запрашивать каждое поле, используя индексы в качестве своих псевдо-идентификаторов.

Вот простая демонстрация:

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

}

Детская площадка

0 голосов
/ 21 ноября 2018

"Невозможно использовать 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...