Преобразовать строку, имеющую json в json или struct - PullRequest
0 голосов
/ 21 октября 2019

Я получаю ответ такого типа от API:

{
    "ok": true,
    "response": "[
    {
        "Id": 163,
        "Name": "Availability",
        "Path": "Performance|Tier1",
        "frequency": "ONE_MIN",
        "Values": [
            {
                "startTimeInMillis": 1571314200000,
                "occurrences": 1,
                "current": 1,
                "min": 0,
                "max": 0,
                "useRange": false,
                "count": 1,
                "sum": 1,
                "value": 1,
                "standardDeviation": 0
            },
            {
                "startTimeInMillis": 1571314260000,
                "occurrences": 1,
                "current": 1,
                "min": 0,
                "max": 0,
                "useRange": false,
                "count": 1,
                "sum": 1,
                "value": 1,
                "standardDeviation": 0
            },
            }
       ]
    }
]
}

Я хочу преобразовать его в формат временных рядов. Для этого сначала я пытаюсь разобрать ответ на эту структуру:

type App struct{
    ID     string   `json:"metric_id"`
    Name   string   `json:"metric_name"`
    Path   string   `json:"metric_path"`
    Frequency    string   `json:"frequency"`
    Values []string `json:"metric_values"`
} 

Я делаю это:

apprsp := App{}
fmt.Println(json.Unmarshal([]byte(ame.Response), &apprsp))

Но я получаю ошибку, пока json.Unmarshal. Я пытаюсь сгенерировать json формата:

{'time':'value','time1':'value2'}

Где time / time1 и value / value2 равны startTimeInMillis и значение из массива значений. Что я делаю не так, пока json unmarshal? Что нужно сделать, чтобы разобрать вышеприведенные данные?

Ответы [ 2 ]

3 голосов
/ 21 октября 2019

Ваша App структура даже близко не связана с документом json, который вы пытаетесь разобрать. Чтобы разобрать документ json, вам нужна структура Go, которая в некоторой степени соответствует структуре базового документа.

type ResponseValue struct {
    StartTime int64 `json:"startTimeMillis"`
    // other elements of Values here, if you're interested in them
}

type Response struct {
  Id int `json:"Id"`
  Name string `json:"Name"`
  Path string `json:"Path"`
  Frequency string `json:"frequency"`
  Values []ResponseValue `json:"Values"`
}

type Body struct {
  Response []Response `json:"response"`
}

var data Body
json.Unmarshal([]byte(ame.Response),&data)

Затем вы можете извлечь временной ряд из data.

1 голос
/ 22 октября 2019

Как сказал bserdar, ваше отображение из вашего json в структуру неверно. Простой способ найти отображение записи - использовать этот инструмент https://mholt.github.io/json-to-go/. Он позволяет вам сопоставить json с автоматически сгенерированной структурой.

вот ваш ответ struct

type Response struct {
    ID        int    `json:"Id"`
    Name      string `json:"Name"`
    Path      string `json:"Path"`
    Frequency string `json:"frequency"`
    Values    []struct {
        StartTimeInMillis int64 `json:"startTimeInMillis"`
        Occurrences       int   `json:"occurrences"`
        Current           int   `json:"current"`
        Min               int   `json:"min"`
        Max               int   `json:"max"`
        UseRange          bool  `json:"useRange"`
        Count             int   `json:"count"`
        Sum               int   `json:"sum"`
        Value             int   `json:"value"`
        StandardDeviation int   `json:"standardDeviation"`
    } `json:"Values"`
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...