2016-06-24 3 views
0

У меня есть строка, представляющая данные транзакции из сети биткойнов. Мне хотелось бы расшифровать строку (с именем my_data) таким образом, чтобы я мог получить только значение поля «хэш». Я попробовал небольшой пример (в реальной ситуации я бы массив, каждая позиция содержит передачи данных, как тот, который вы можете увидеть в коде):Использование JSON для декодирования небольшого количества данных из огромной строки

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    var my_data = []byte(`{ 
    "ver":1, 
    "inputs":[ 
     { 
     "sequence":4294967295, 
     "prev_out":{ 
      "spent":true, 
      "tx_index":156978299, 
      "type":0, 
      "addr":"34cXotJvHAz1RVFtmK2vU29E9d5hF2manG", 
      "value":848231245, 
      "n":1, 
      "script":"a914200f3e946fcf58d3f0787034a610860f0b96332d87" 
     }, 
      "script":"004730440220149e4cd90c7b2648e89d357162f383098504eea21d390f02e5a289e114ed36520220556da97f0e6789d34f4fb1faf7a1c1055368c01ede85b8101be5007f7b9f3c190147304402200d72e1b91684cdb0e63ea2a24d6ae0b9e38dacdf068e2e08e46ce7f951cdc9dd0220242be0131722287bc15e3d802ba3dea9df0c18f3ec0ac6913b4146f7deb717c90147522102dfd3c8864cddd4d88a8f602d016a656132f89f66450966f9a4a45dea11ec6eb92102c5f064226fcd75fdcae289118b0c4d20e1bafbf4068e7102baec66fade94e3b952ae" 
     } 
    ], 
    "block_height":417695, 
    "relayed_by":"138.201.2.34", 
    "out":[ 
     { 
     "spent":false, 
     "tx_index":156978302, 
     "type":0, 
     "addr":"1PWDLsx73qfyCUga29ffAjc2UVdWEeeHDL", 
     "value":3123438, 
     "n":0, 
     "script":"76a914f6d92221d499bf8c01a0dc6f0c04b82d6b62301f88ac" 
     }, 
     { 
     "spent":true, 
     "tx_index":156978302, 
     "type":0, 
     "addr":"34cXotJvHAz1RVFtmK2vU29E9d5hF2manG", 
     "value":845057807, 
     "n":1, 
     "script":"a914200f3e946fcf58d3f0787034a610860f0b96332d87" 
     } 
    ], 
    "lock_time":0, 
    "size":334, 
    "double_spend":false, 
    "time":1466725723, 
    "tx_index":156978302, 
    "vin_sz":1, 
    "hash":"fae2577ff2a1cfa977c7a883ea4e594c91bd67c767ef1b7870475022c08a453b", 
    "vout_sz":2 
}`) 
    type Tx struct { 
     hash string 
    } 
    var txs []Tx 
    err := json.Unmarshal(my_data, &txs) 
    if err != nil { 
     fmt.Println("error:", err) 
    } 
    for i:=0; i<len(txs); i++{ 
     fmt.Printf("%s\n\n", txs[i].hash) 
    } 
} 

, но я постоянно получаю следующее сообщение об ошибке:

error: json: cannot unmarshal object into Go value of type []main.Tx 

Есть ли более простой способ, которым я мог бы попробовать, что не нуждается в библиотеке «encoding/json»?

Заранее благодарен!

РЕДАКТИРОВАТЬ:

Кода я был адаптирован из примера я извлеченный из here.

Я считаю, что проблема заключается в строке, которую я пытаюсь декодировать, поскольку шаблон, на котором он построен, позволяет вложенные списки и значения полей с кавычками или без них. Хотя я не уверен.

ответ

2

Kaedys прав по обоим пунктам.

  1. Ваш JSON - это объект, а не массив.

  2. Вы не экспортируете поле hash в свою структуру, которое требует библиотека encoding/json.

Если поставить квадратные скобки вокруг входного JSON (чтобы сделать это массив) и заглавной «хэш» имя поля, code will work.

+0

Рекомендуется использовать код в своем сообщении вместе со ссылками на сторонний сайт (хотя это может быть более наглядным с его интерактивными движками). Частично потому, что ссылка может сломаться. – YakovL

1

Ваш JSON - это не список, который должен был быть для маршала на срез.

Однако, если ваши входные данные фактически являются списком, вы, вероятно, сталкиваетесь с проблемами структуры назначения (а точнее, поля hash), не экспортируемого. Также может быть проще использовать анонимную структуру (которая экспортируется по природе), а не определение типа. Вместо того, чтобы:

type Tx struct { 
    hash string 
} 
var txs []Tx 
err := json.Unmarshal(my_data, &txs) 

использования:

var txs []struct { 
    Hash string `json:"hash"` // tag not strictly necessary, but useful for clarity 
} 
err := json.Unmarshal(my_data, &txs) 
+0

Спасибо, но, к сожалению, даже после обновления кода, как было предложено, я все равно получаю сообщение об ошибке: 'error: json: не может помещать объект в значение Go type type [] struct {Hash string" json: \ "hash \" '}" –