Unmarshaling JSON в тип - PullRequest
       9

Unmarshaling JSON в тип

0 голосов
/ 11 мая 2018

Я получаю следующие данные:

{
  "timestamp": "1526058949",
  "bids": [
    [
      "7215.90",
      "2.31930000"
    ],
    [
      "7215.77",
      "1.00000000"
    ]
  ]
}

через веб-сокет, и я хотел бы разархивировать его в

type OrderBookItem struct {
    Price  string
    Amount string
}

type OrderBookResult struct {
    Timestamp string            `json:"timestamp"`
    Bids      []OrderBookItem `json:"bids"`
    Asks      []OrderBookItem `json:"asks"`
}

Разобрать его с помощью:

s := e.Data.(string)
d := &OrderBookResult{}
err := json.Unmarshal([]byte(s), d)
if err == nil {
 ....
} else {
 fmt.Println(err.Error())
}

Но я продолжаю получать сообщение об ошибке:

json: не удается разархивировать строку в поле Go структуры OrderBookResult.bids типа feed.OrderBookItem

Когда я изменяю структуру на

type OrderBookResult struct {
        Timestamp string     `json:"timestamp"`
        Bids      [][]string `json:"bids"`
        Asks      [][]string `json:"asks"`
} 

это работает.Я хотел бы, чтобы они были определены как float64, что они и есть.Что я должен изменить?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Как гласит ошибка:

json: невозможно разархивировать строку в поле структуры Go OrderBookResult.bids типа feed.OrderBookItem

Мы не можем преобразовать OrderBookResult.bids, которыепредставляет собой фрагмент строки в OrderBookItem, представляющий собой структуру struct

, которая реализует интерфейс UnmarshalJSON для преобразования массива в объекты для price и amount из OrderBookItem struct.Как показано ниже

package main

import (
    "fmt"
    "encoding/json"
)

type OrderBookItem struct {
    Price  string
    Amount string
}

func(item *OrderBookItem) UnmarshalJSON(data []byte)error{
    var v []string
    if err:= json.Unmarshal(data, &v);err!=nil{
        fmt.Println(err)
        return err
    }
    item.Price  = v[0]
    item.Amount = v[1]
    return nil
}

type OrderBookResult struct {
    Timestamp string            `json:"timestamp"`
    Bids      []OrderBookItem   `json:"bids"`
    Asks      []OrderBookItem   `json:"asks"`
}

func main() {
    var result OrderBookResult
    jsonString := []byte(`{"timestamp": "1526058949", "bids": [["7215.90", "2.31930000"], ["7215.77", "1.00000000"]]}`)
    if err := json.Unmarshal([]byte(jsonString), &result); err != nil{
        fmt.Println(err)
    }
    fmt.Printf("%+v", result)
}

Пример работы игровой площадки

Для получения дополнительной информации прочтите спецификации GoLang для Unmarshaler

0 голосов
/ 11 мая 2018

Вы рассматриваете ваши ставки как структуру из двух отдельных строк, когда они действительно представляют собой фрагмент строки в JSON. Если вы измените OrderBookItem на

type OrderBookItem []string

это то, как вы определили их во втором бите, который работает.

Чтобы получить доступ к значениям, которые вы просто должны сделать: цена: = d.Bids [0] сумма: = d.Bids [1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...