首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JSON解编组在我的代码中不输出,在操场上工作。

JSON解编组在我的代码中不输出,在操场上工作。
EN

Stack Overflow用户
提问于 2019-11-11 04:00:45
回答 1查看 168关注 0票数 0

在回顾了几个问题之后,我决定提出我的问题。我可以说几句话..。

  • 我要插入json数据的结构是导出的,它的字段也是如此。
  • 我要插入json数据的结构是由protoc自动生成的。
  • 我在go游乐场https://goplay.space/#WZWs3dsVcR5中使用的结构和代码

我的代码被分成几个部分。

定义QueryParm结构的原型文件消息。

代码语言:javascript
代码运行次数:0
运行
复制
message QueryParm {
  string column_name = 1;
  string column_type = 2;
}

我在protobuf.pb.go中的结构

代码语言:javascript
代码运行次数:0
运行
复制
type QueryParm struct {
    ColumnName           string   `protobuf:"bytes,1,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"`
    ColumnType           string   `protobuf:"bytes,2,opt,name=column_type,json=columnType,proto3" json:"column_type,omitempty"`
    WhereValue           string   `protobuf:"bytes,3,opt,name=where_value,json=whereValue,proto3" json:"where_value,omitempty"`
    XXX_NoUnkeyedLiteral struct{} `json:"-"`
    XXX_unrecognized     []byte   `json:"-"`
    XXX_sizecache        int32    `json:"-"`
}

我在pg_client.go中的数据

代码语言:javascript
代码运行次数:0
运行
复制
type PgData struct {
    ...
    QueryParms   string    `orm:"null"`
    ...
}

和我在grpc_client.go中的作用

代码语言:javascript
代码运行次数:0
运行
复制
func createJobResponse(d *pg.PgData) (*pb.JobResponse, error) {
    var qp []*pb.QueryParm

    if d.QueryParms == *new(string) {
        d.QueryParms = "[{}]"
    }
    fmt.Printf("Parms: %v\nType: %T\n", d.QueryParms, d.QueryParms)
    if err := json.Unmarshal([]byte(d.QueryParms), &qp); err != nil {
        return nil, err
    }
    fmt.Printf("Parms: %v\nType: %T\n", qp, qp)
    return &pb.JobResponse{
        ...
        QueryParms:   qp,
        ...
    }, nil
}

我收到的post解组输出在代码中为空,并在操场上包含空的QueryParm结构指针。JSON字符串显然存在于此之前。

代码语言:javascript
代码运行次数:0
运行
复制
Parms: [{"ColumnName":"message_property_assetId","ColumnType":"string"},{"ColumnName":"id","ColumnType":"string"},{"ColumnName":"message_id","ColumnType":"string"},{"ColumnName":"message_security_tenantId","ColumnType":"string"}]
Type: string
Parms: [   ]
Type: []*proto_export.QueryParm

我的代码和操场的输出有什么不同的原因吗?

结论编辑:

我想说的是,由于一些奇怪的原因,我使用了一个不同的结构来编码我的JSON,而不是对它进行解码。这导致JSON字段名不同,并阻止正确解码JSON。

确保使用相同的结构进行编码,就像解码一样!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-11 05:13:36

两个工作解决方案:

  1. 你可以使用:
代码语言:javascript
代码运行次数:0
运行
复制
var qp []interface{}

试试

代码语言:javascript
代码运行次数:0
运行
复制
package main

import (
    "encoding/json"
    "fmt"
)

type QueryParm struct {
    ColumnName           string   `protobuf:"bytes,1,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"`
    ColumnType           string   `protobuf:"bytes,2,opt,name=column_type,json=columnType,proto3" json:"column_type,omitempty"`
    WhereValue           string   `protobuf:"bytes,3,opt,name=where_value,json=whereValue,proto3" json:"where_value,omitempty"`
    XXX_NoUnkeyedLiteral struct{} `json:"-"`
    XXX_unrecognized     []byte   `json:"-"`
    XXX_sizecache        int32    `json:"-"`
}

func main() {
    jsonstr := `[
        {"ColumnName":"message_property_assetId","ColumnType":"string"},
        {"ColumnName":"id","ColumnType":"string"},
        {"ColumnName":"message_id","ColumnType":"string"},
        {"ColumnName":"message_security_tenantId","ColumnType":"string"}]`
    // var qp []QueryParm
    var qp []interface{}
    if err := json.Unmarshal([]byte(jsonstr), &qp); err != nil {
        return
    }
    fmt.Println(qp)
}

输出:

代码语言:javascript
代码运行次数:0
运行
复制
[map[ColumnName:message_property_assetId ColumnType:string] map[ColumnName:id ColumnType:string] map[ColumnName:message_id ColumnType:string] map[ColumnName:message_security_tenantId ColumnType:string]]
  1. JSON标记中有column_namecolumn_type,而不是ColumnNameColumnTypejson:"column_name,omitempty",因此您可以更改输入字符串,例如:
代码语言:javascript
代码运行次数:0
运行
复制
    jsonstr := `[
    {"column_name":"message_property_assetId","column_type":"string"},
    {"column_name":"id","column_type":"string"},
    {"column_name":"message_id","column_type":"string"},
    {"column_name":"message_security_tenantId","column_type":"string"}]`

试试

代码语言:javascript
代码运行次数:0
运行
复制
package main

import (
    "encoding/json"
    "fmt"
)

type QueryParm struct {
    ColumnName           string   `protobuf:"bytes,1,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"`
    ColumnType           string   `protobuf:"bytes,2,opt,name=column_type,json=columnType,proto3" json:"column_type,omitempty"`
    WhereValue           string   `protobuf:"bytes,3,opt,name=where_value,json=whereValue,proto3" json:"where_value,omitempty"`
    XXX_NoUnkeyedLiteral struct{} `json:"-"`
    XXX_unrecognized     []byte   `json:"-"`
    XXX_sizecache        int32    `json:"-"`
}

func main() {
    jsonstr := `[
        {"column_name":"message_property_assetId","column_type":"string"},
        {"column_name":"id","column_type":"string"},
        {"column_name":"message_id","column_type":"string"},
        {"column_name":"message_security_tenantId","column_type":"string"}]`
    var qp []QueryParm
    if err := json.Unmarshal([]byte(jsonstr), &qp); err != nil {
        return
    }
    fmt.Printf("%+v\n", qp)
}

输出:

代码语言:javascript
代码运行次数:0
运行
复制
[{ColumnName:message_property_assetId ColumnType:string WhereValue: XXX_NoUnkeyedLiteral:{} XXX_unrecognized:[] XXX_sizecache:0} {ColumnName:id ColumnType:string WhereValue: XXX_NoUnkeyedLiteral:{} XXX_unrecognized:[] XXX_sizecache:0} {ColumnName:message_id ColumnType: WhereValue: XXX_NoUnkeyedLiteral:{} XXX_unrecognized:[] XXX_sizecache:0} {ColumnName:message_security_tenantId ColumnType:string WhereValue: XXX_NoUnkeyedLiteral:{} XXX_unrecognized:[] XXX_sizecache:0}]
  1. 您可以编写自定义JSON编组和解压缩。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58795386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档