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

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

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

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

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

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

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

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

我在protobuf.pb.go中的结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
type PgData struct {
    ...
    QueryParms   string    `orm:"null"`
    ...
}

和我在grpc_client.go中的作用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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-10 21:13:36

两个工作解决方案:

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

试试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
[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
运行
AI代码解释
复制
    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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
[{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

复制
相关文章
企业面试题: jquery中$.get()提交和$.post()提交有区别吗?
1、请求方式不同:$.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。
舒克
2019/08/09
9900
今天,你有微信小游戏提交审核吗?
12月10日的推文里,写过在未来2个月里,微信小程序应该是要开放了,不然开发者们应该是憋不住了,结果确实都憋不住了。今天微信官方开放了小游戏的能力,同期上线小游戏【跳一跳】,果然如当初上线打飞机的游戏一样,先从休闲小游戏入手。 收到官方推文,立马升级了微信,体验了跳一跳小游戏。 游戏简单易上手,无需引导也能玩。游戏玩法很简单,很早之前出现在社交网站就出现过类似的游戏。游戏虽小,充分的利用了微信生态的传播手段:好友挑战小程序卡片、群挑战小程序卡片、好友排行榜、群排行榜。 同步在【发现】-【小程
企鹅号小编
2018/01/15
2.7K0
今天,你有微信小游戏提交审核吗?
部署docsify项目时出现无法访问README.md
今天在服务器上部署用docsify编写的文档项目,结果发现首页竟然无法显示,提示404。
用户8851537
2021/08/03
1.9K1
README.md
README.md文件是一个项目的入门手册,里面介绍了整个项目的使用、功能等等。所以README文件写得好不好,关系到这个项目能不能更容易的被其他人了解和使用。
wade
2020/04/24
7700
git文件无修改diff无变更居然有许多文件需要提交—被修改
其实有很多种请客。git status可能有一些不同的原因,但git diff可能没有。
周陆军博客
2023/06/06
4.2K0
你知道脑机接口中的"后门"攻击吗?它真的有可能在现实中实现
机器学习在脑机接口中的成功应用,使脑机接口得到了快速的发展。然而,对抗攻击的发现让我们不得不重新思考机器学习模型的安全性。这些潜在的危险性给基于机器学习的脑机接口的实际应用提出了不可逃避的难题。华中科技大学伍冬睿教授研究团队在最新的工作中提出了实际可实现的污染攻击方法。通过在训练样本中加入少量的污染样本,这些污染样本能够在模型训练后在模型内创建一个"后门",具有后门钥匙的测试样本将被分类为攻击者指定的目标类别。该方法与以前的方法最不同的是,"后门"密钥不需要与EEG试验同步,因此非常易于实现。该项研究突显了基于EEG的BCI的关键安全问题。
脑机接口社区
2020/11/03
1.1K0
你知道脑机接口中的"后门"攻击吗?它真的有可能在现实中实现
readme.md
如题目所示,要求是根据所给的字符串命令,来渲染一个迷宫,并通过字符串输出。 程序简要思路如下:
和蔼的zhxing
2019/10/22
4840
设计RPC接口时,你有考虑过这些吗?
RPC 框架的讨论一直是各个技术交流群中的热点话题,阿里的 dubbo,新浪微博的 motan,谷歌的 grpc,以及不久前蚂蚁金服开源的 sofa,都是比较出名的 RPC 框架。RPC 框架,或者一部分人习惯称之为服务治理框架,更多的讨论是存在于其技术架构,比如 RPC 的实现原理,RPC 各个分层的意义,具体 RPC 框架的源码分析…但却并没有太多话题和“如何设计 RPC 接口”这样的业务架构相关。
kirito-moe
2018/07/25
3.1K0
设计RPC接口时,你有考虑过这些吗?
Git提交时过滤某些文件
4.这个文件处理好以后,如果感觉没有作用,说明你在创建这个文件之前就已经add过了,这时执行
Arno
2019/12/06
2.9K0
Git提交时过滤某些文件
Git 如何针对项目修改本地提交提交人的信息
如果你不是使用 TortoiseGit,你可以在你项目 Check out 的目录中,打开文件:
HoneyMoose
2019/09/11
9280
Git 如何针对项目修改本地提交提交人的信息
【数据仓库】什么是 Azure Synapse,它与 Azure Data Bricks 有何不同?
Azure Synapse Analytics 是一项针对大型公司的无限信息分析服务,它被呈现为 Azure SQL 数据仓库 (SQL DW) 的演变,将业务数据存储和宏或大数据分析结合在一起。 在处理、管理和提供数据以满足即时商业智能和数据预测需求时,Synapse 为所有工作负载提供单一服务。后者通过与 Power BI 和 Azure 机器学习的集成而成为可能,因为 Synapse 能够使用 ONNX 格式集成数学机器学习模型。它提供了处理和查询大量信息的自由度.作为微软在西班牙为数不多的 Pow
架构师研究会
2022/03/08
1.5K0
提交代码有学问....
从上一篇上榜了....发文一来,LeetCode-Master开始有大量的代码合入请求。
代码随想录
2021/06/17
5030
Git修改已提交的commit1 本地修改
由于以下修改本身是对版本历史的修改,在需要push到远程仓库时,往往是不成功的,只能强行push,这样会出现的一个问题就是,如果你是push到多人协作的远程仓库中,会对其他人的远程操作构成影响。通常情况下,建议与项目远程仓库的管理员进行沟通,在完成你强制push操作后,通知其他人同步。
JavaEdge
2018/08/10
2.1K0
mysql改变主键字段类型吗_mysql修改字段类型有哪些?
mysql修改字段类型有:1、添加字段【alter table table1(表名)add No_id(字段名)】;2、修改字段类型【t1(表名) alter column a(字段名)】;3、删除某表的字段【drop ‘cpid’】。
全栈程序员站长
2022/08/14
8.1K0
mysql改变主键字段类型吗_mysql修改字段类型有哪些?
Git 如何针对项目修改本地提交提交人的信息
如果你不是使用 TortoiseGit,你可以在你项目 Check out 的目录中,打开文件:
HoneyMoose
2019/09/16
1.2K0
Git 如何针对项目修改本地提交提交人的信息
如何让你的程序支持管道输入
《如何让你的程序支持管道输入》一文主要介绍了如何让你的程序支持管道输入,以及支持管道输入的方法和示例。通过使用管道符号 |,可以将一个命令的输出作为另一个命令的输入,从而提高程序的灵活性和可重用性。在具体实现中,需要考虑从标准输入读取数据和支持标准输出写入数据,从而支持管道输入和输出。
雷大亨
2017/12/07
1.7K0
【Git】修改已经提交的commit内容
通过 Git 进行版本管理时,对于已经提交但没有 push 的 message 信息,发现提交信息填写错误后,如何进行修改? 对于已经 push 的 message 信息如何修改?通过git rebase -i进行分支管理,以及重新操作已经提交的分支信息[reword,edit,squash 等]。此次用到的主要是reword修改已经提交的message信息。
程序小工
2018/09/12
9.6K1
git 提交文件中的部分修改
在 Git 提交一个文件的时候,有时候会在同一个文件中,包含两个不同功能的修改,或者一个功能完成了,而别的部分还没有完善不应该进入代码库,这时候如果使用git add file-name的话,会将这个文件中的所有更新都提交,达不到上述的需求。针对这种场景,git 提供了更细粒度的提交命令git add -p,可以分部分提交一个文件中的更新代码块,实测能满足常见的需求。这里简要记录一下如何使用这个命令。
王云峰
2023/10/23
3760
git 提交文件中的部分修改
Git示例教程 - 修改上次提交
如果上次提交的内容有误或者不全,想要修改上次提交中文件的内容,或是添加新的文件,可以执行下面的命令:
KINGYT
2019/10/28
1.5K0
IDEA 查看最近修改、已提交文件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
微风-- 轻许--
2019/11/13
5K0

相似问题

有可能在Azure结束okta会议吗?

111

Azure管道在提交时筛选github用户

10

有可能在mysql中修改相同的内容吗?

24

Azure DevOps CI/CD管道:失败时恢复提交

13

我可以不提交就运行Azure DevOps管道吗?

313
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文