解组JSON Go中的数组Array [英] Unmarshal JSON Array of arrays in Go

查看:144
本文介绍了解组JSON Go中的数组Array的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想解析一些json数据。数据如下:


{id:someId,key_1:value_1,key_2:值_2\" , KEY_3: VALUE_3, 点:[[1487100466412 50.032178, 8.526018,300,0.0,26,0],[1487100471563 50.030869, 8.525949,300,0.0 ,38,0],[1487100475722 50.028514, 8.525959,225,0.0,69,-900],[1487100480834 50.025827, 8.525793,275,0.0,92,-262],.. 。}}


我构建了一个go结构体:

  type SomeStruct struct {
ID字符串`json:id`
Key1字符串`json:key_1`
Key2字符串`json:key_2`
Key3字符串`json:key_3`
Points []点`json:points`
}

类型Point结构{
Timestamp int64 `json:0`
纬度float64`json:1,string`
Longitude float64`json:2,string`
Altitude int`json:3
Value1 float64`json:4`
Value2 int`json:5`
Value3 int`json:6`
}

我解组j儿子数据

  var track SomeStruct 
错误:= json.Unmarshal(data,& track)
if(error!= nil){
fmt.Printf(解析数据时出错:%s,错误)
}




json:不能将数组解组成Go类型的值Point {someId value_1 value_2 value_3 [{0 0 0 0 0 0 0} {0 0 0 0 0 b


因此,第一个json键被正确解析,但我无法弄清楚如何获得点数据,这是一个数组数组。



生成结构也是这里的建议,除非我没有使用嵌套结构,但使用单独的类型。使用建议的嵌套结构并没有什么区别:
JSON-to-Go


我需要为此执行我自己的Unmarshaller吗?



====== =更新解决方案============

为Point结构实现UnmarshalJSON接口就足够了。
下面的例子没有包含适当的错误处理,但它显示了方向。



Playground示例

 包主

import(
encoding / json
fmt
strconv


类型SomeStruct结构{
ID字符串`json:id`
Key1字符串`json:key_1`
Key2字符串`json:key_2`
Key3字符串`json:key_3`
点[]点``
}

类型点结构{
时间戳int64
纬度float64
经度float64
高度int
Value1 float64
Value2 int16
Value3 int16
}

func(tp * Point)UnmarshalJSON(data [] byte)error {
var v [] interface {}
if err:= json.Unmarshal(data,& v); err!= nil {
fmt.Printf(错误解码%v \ n,错误)
返回错误
}
tp.Timestamp = int64(v [0 ]。(float64))
tp.Latitude,_ = strconv.ParseFloat(v [1]。(string),64)
tp.Longitude,_ = strconv.ParseFloat(v [2]。 (string),64)
tp.Altitude = int(v [3]。(float64))
tp.Value1 = v [4]。(float64)
tp.Value2 = int16 (v [5]。(float64))
tp.Value3 = int16(v [6]。(float64))

return nil
}

func main(){

const data =`{id:someId,key_1:value_1,key_2:value_2,key_3:value_3 , 点:[[1487100466412 50.032178, 8.526018,300,0.0,26,0],[1487100471563 50.030869, 8.525949,300,0.0,38,0],[1487100475722, 50.028514,8.525959,225,0.0,69,-900],[1487100480834,50.025827,8.525793,275,0.0,92,-262]]}`

var SomeStruct
json.Unmarshal([] byte(data),& something)

fmt.Printf(%v,something)
}



$
$
$
$

是的。

您试图将一个数组解组成一个结构体( Point ) ,这意味着您需要告诉JSON解组器,数组值如何映射到结构值。



另请注意,您的标签在定义。 json标签指的是键名,但数组没有键(在JavaScript中,它们可以像访问一样进行访问,但这不是JavaScript)。换句话说,如果你的JSON看起来像 {0:123} ,那么 json:0 。如果你实现你自己的解组器,你可以摆脱那些json标签。


I want to parse some json data in go. The data looks like this:

{"id":"someId","key_1":"value_1","key_2":"value_2","key_3":"value_3","points":[[1487100466412,"50.032178","8.526018",300,0.0,26,0],[1487100471563,"50.030869","8.525949",300,0.0,38,0],[1487100475722,"50.028514","8.525959",225,0.0,69,-900],[1487100480834,"50.025827","8.525793",275,0.0,92,-262],...]}

I built a go struct:

type SomeStruct struct {
   ID   string `json:"id"`
   Key1 string `json:"key_1"`
   Key2 string `json:"key_2"`
   Key3 string `json:"key_3"`
   Points []Point `json:"points"`
}

type Point struct {
   Timestamp int64 `json:"0"`
   Latitude float64 `json:"1,string"`
   Longitude float64 `json:"2,string"`
   Altitude int `json:"3"` 
   Value1 float64 `json:"4"`
   Value2 int `json:"5"`
   Value3 int `json:"6"`      
}

I unmarshal the json data

var track SomeStruct
error := json.Unmarshal(data,&track)
if(error != nil){
    fmt.Printf("Error while parsing data: %s", error)
}

json: cannot unmarshal array into Go value of type Point{someId value_1 value_2 value_3 [{0 0 0 0 0 0 0} {0 0 0 0 0 0 0} {0 0 0 0 0 0 0}...]}

So the first json keys are parsed correctly, but I cannot figure out how to get the point data, which is an array of arrays.

The generate struct is also the suggest one from here, except I don't use a nested struct but a separate type. Using the suggested nested struct does not make a difference: JSON-to-Go

Do I need to implement my own Unmarshaller for this?

======= UPDATE SOLUTION ============

It is enough to implement the UnmarshalJSON interface for the Point struct. The example below does not contain proper error handling but it show the direction.

Playground example

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

type SomeStruct struct {
    ID     string  `json:"id"`
    Key1   string  `json:"key_1"`
    Key2   string  `json:"key_2"`
    Key3   string  `json:"key_3"`
    Points []Point `json:"points"`
}

type Point struct {
    Timestamp int64
    Latitude  float64
    Longitude float64
    Altitude  int
    Value1    float64
    Value2    int16
    Value3    int16
}

func (tp *Point) UnmarshalJSON(data []byte) error {
    var v []interface{}
    if err := json.Unmarshal(data, &v); err != nil {
        fmt.Printf("Error whilde decoding %v\n", err)
        return err
    }
    tp.Timestamp = int64(v[0].(float64))
    tp.Latitude, _ = strconv.ParseFloat(v[1].(string), 64)
    tp.Longitude, _ = strconv.ParseFloat(v[2].(string), 64)
    tp.Altitude = int(v[3].(float64))
    tp.Value1 = v[4].(float64)
    tp.Value2 = int16(v[5].(float64))
    tp.Value3 = int16(v[6].(float64))

    return nil
}

func main() {

    const data =    `{"id":"someId","key_1":"value_1","key_2":"value_2","key_3":"value_3","points":[[1487100466412,"50.032178","8.526018",300,0.0,26,0],[1487100471563,"50.030869","8.525949",300,0.0,38,0],[1487100475722,"50.028514","8.525959",225,0.0,69,-900],[1487100480834,"50.025827","8.525793",275,0.0,92,-262]]}`

var something SomeStruct
json.Unmarshal([]byte(data), &something)

fmt.Printf("%v", something)
}

解决方案

Do I need to implement my own Unmarshaller for this?

Yes.

You're trying to unmarshal an array into a struct (Point), which means you need to tell the JSON unmarshaler how the array values map to the struct values.

Also note that your tags are incorrect in your Point definition. json tags refer to the key names, but arrays don't have keys (in JavaScript they can be accessed as if they do, but this isn't JavaScript). In other words, json:"0" will only work if your JSON looks like {"0":123}. If you implement your own unmarshaler, you can just get rid of those json tags.

这篇关于解组JSON Go中的数组Array的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆