在这篇文章中,我们将为您详细介绍在Golang中解编json:必填字段?的内容,并且讨论关于golangjson解析太蠢的相关问题。此外,我们还会涉及一些关于AngularJS:ng-show/ng-
在这篇文章中,我们将为您详细介绍在Golang中解编json:必填字段?的内容,并且讨论关于golang json解析太蠢的相关问题。此外,我们还会涉及一些关于AngularJS:ng-show / ng-hide必填字段、Golang中使用JSON时区分空字段和未设置字段的方法、GoogleJsonResponseException:必填字段名称 发件人:收件人:注意:参考:、joi验证:必填字段取决于ohers字段的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 在Golang中解编json:必填字段?(golang json解析太蠢)
- AngularJS:ng-show / ng-hide必填字段
- Golang中使用JSON时区分空字段和未设置字段的方法
- GoogleJsonResponseException:必填字段名称 发件人:收件人:注意:参考:
- joi验证:必填字段取决于ohers字段
在Golang中解编json:必填字段?(golang json解析太蠢)
如果在Golang中取消编组时,如果在json中找不到字段,是否可能会产生错误?我在文档中找不到它。是否有任何标记指定所需的字段?
答案1
小编典典encoding/json
程序包中没有将字段设置为“必需”的标签。您要么必须编写自己的MarshalJSON()
方法,要么对缺少的字段进行后期检查。
要检查缺少的字段,您将必须使用指针以区分缺失/空值和零值:
type JsonStruct struct { String *string Number *float64}
完整的工作示例:
package mainimport ( "fmt" "encoding/json")type JsonStruct struct { String *string Number *float64}var rawJson = []byte(`{ "string":"We do not provide a number"}`)func main() { var s *JsonStruct err := json.Unmarshal(rawJson, &s) if err != nil { panic(err) } if s.String == nil { panic("String is missing or null!") } if s.Number == nil { panic("Number is missing or null!") } fmt.Printf("String: %s Number: %f\n", *s.String, *s.Number)}
操场
AngularJS:ng-show / ng-hide必填字段
例:
Check Me to Show Additional Fields <input type="checkBox" ng-model="checked"> Additional Fields <input type="number"id="inputamount" data-ng-model="itemamount" step="any" required ng-show="checked"/> <input type="text"id="inputlocation" data-ng-model="itemlocation" placeholder="Location" required ng-show="checked"/>
解决方法
<input type="number" ng-required="{{checked}}"id="inputamount" data-ng-model="itemamount" step="any" ng-show="checked"/>
Golang中使用JSON时区分空字段和未设置字段的方法
下面由
几周前, 我在使用 Golang 微服务, 需要添加使用 JSON 数据的 CURP 操作的支持. 通常, 我会为实体创建一个结构体, 该结构体中定义了所有字段以及 ''omitempty'' 属性, 如下所示
type Article struct { Id string `json:"id"` Name string `json:"name,omitempty"` Desc string `json:"desc,omitempty"` }
问题
但是这种表示形式带来了严重的问题, 尤其对于 Update 或 Edit 操作而言.
例如, 假设更新请求的 JSON 数据看起来像是这样
立即学习“go语言免费学习笔记(深入)”;
{"id":"1234","name":"xyz","desc":""}
注意为空的 desc 字段. 现在让我们来看看这段请求数据在 Go 中解封后是怎么样的
func Test_JSON1(t *testing.T) { jsonData:=`{"id":"1234","name":"xyz","desc":""}` req:=Article{} _=json.Unmarshal([]byte(jsonData),&req) fmt.Printf("%+v",req) }Output: === RUN Test_JSON1 {Id:1234 Name:xyz Desc:}
这里的描述是一个空字符串, 很明显客户端希望将 desc 设置为空字符串, 这是由我们的程序推断出来的.
但是, 如果客户端不希望更改 Desc 的现有值, 在这种情况下, 再次发送一个描述字符串是不正确的, 因此请求的 JSON 数据可能看起来像是这样
{"id":"1234","name":"xyz"}
我们解封到我们的结构体中
func Test_JSON2(t *testing.T) { jsonData:=`{"id":"1234","name":"xyz"}` req:=Article{} _=json.Unmarshal([]byte(jsonData),&req) fmt.Printf("%+v",req) }Output: === RUN Test_JSON2 {Id:1234 Name:xyz Desc:}
额, 仍然会将 Desc 作为空字符串获取, 那么如何区分未设置字段和空字段
简答? 指针
解决办法
受到一些现有 Golang 库的启发, 如 go-github. 我们可以将结构体字段更改为指针类型, 如下所示
type Article struct { Id string `json:"id"` Name *string `json:"name,omitempty"` Desc *string `json:"desc,omitempty"` }
通过这样做, 我们在字段中添加了额外的状态. 如果原始 JSON 中不存在该字段, 则结构体字段将为空 (nil).
另一方面, 如果该字段确实存在并且为空, 则指针不为空, 并且该字段包含空值.
注意 - 我没有将 ''Id'' 字段更改为指针类型, 因为它不具备空状态, id 是必需的, 类似数据库中的 id.
我们再尝试一下.
func Test_JSON_Empty(t *testing.T) { jsonData := `{"id":"1234","name":"xyz","desc":""}` req := Article{} _ = json.Unmarshal([]byte(jsonData), &req) fmt.Printf("%+v\n", req) fmt.Printf("%s\n", *req.Name) fmt.Printf("%s\n", *req.Desc) } func Test_JSON_Nil(t *testing.T) { jsonData := `{"id":"1234","name":"xyz"}` req := Article{} _ = json.Unmarshal([]byte(jsonData), &req) fmt.Printf("%+v\n", req) fmt.Printf("%s\n", *req.Name) }
Output
=== RUN Test_JSON_Empty {Id:1234 Name:0xc000088540 Desc:0xc000088550} Name: xyz Desc: --- PASS: Test_JSON_Empty (0.00s)=== RUN Test_JSON_Nil {Id:1234 Name:0xc00005c590 Desc:<nil>} Name: xyz --- PASS: Test_JSON_Nil (0.00s)
第一种情况, 由于 desc 设置为空字符串, 因此我们在 Desc 获得了一个非空指针并包含一个空字符串的值. 第二种情况, 该字段未设置, 我们得到了一个空字符串指针.
因此我们能够区分两种更新. 这种方式不仅适用于字符串, 而且适用于其他的所有数据类型, 包括整型, 嵌套结构体, 等.
但是这种方法也存在一些问题.
空安全性: 非指针数据类型具备固有的空安全性. 在 Golang 中这意味着字符串或整型永远不能为空. 他们始终具备默认值. 但是如果定义了指针, 则这些数据类型在未手动设置的情况下默认为空. 因此, 尝试在不验证可空性的情况下访问那些指针的数据可能会导致应用程序崩溃.
# 以下代码将崩溃, 因为 desc 为空 func Test_JSON_Nil(t *testing.T) { jsonData := `{"id":"1234","name":"xyz"}` req := Article{} _ = json.Unmarshal([]byte(jsonData), &req) fmt.Printf("%+v\n", req) fmt.Printf("%s\n", *req.Desc) }
通过始终检查空指针可以很容易的解决此问题, 但你的代码可能会看起来会很啰嗦.
可打印性: 如在基于指针的解决方案的输出中你可能已经注意到的问题, 不会打印指针的值. 二十打印了指针的十六进制值, 这在应用程序中没什么用. 这也可以通过重新使用 stringer 接口来克服.
func (a *Article) String() string { output:=fmt.Sprintf("Id: %s ",a.Id) if a.Name!=nil{ output+=fmt.Sprintf("Name: '%s' ",*a.Name) } if u.Desc!=nil{ output+=fmt.Sprintf("Desc: '%s' ",u.Desc) } return output }
附录:
- 解决上述问题的另一种方法是使用具有可为空类型的三方库, 其类型可提供检查是否为空的方法, 而无需关心指针.
- github.com/guregu/null
- github.com/google/go-github
原文地址:https://medium.com/@arpitkh96/differentiate-between-empty-and-not-set-fields-with-json-in-golang-957bb2c5c065
译文地址:https://learnku.com/go/t/49332
以上就是Golang中使用JSON时区分空字段和未设置字段的方法的详细内容,更多请关注php中文网其它相关文章!
GoogleJsonResponseException:必填字段名称 发件人:收件人:注意:参考:
根据您的问题,我可以理解Google Analytics API与Google Apps脚本的高级Google服务一起使用。在这种情况下,new_df = (df.assign(total=df[['VacationHours','SickLeaveHours']].sum(axis=1))
.assign(lambda df: df.groupby(['ManagerID','JobTitle'])['total'].transform('sum'))
)
中的resource
可以直接使用“ Web属性:插入”方法的请求正文。我认为您的错误原因是由于此。因此,请进行如下修改,然后再次进行测试。
发件人:
Analytics.Management.Webproperties.insert(resource,accountId)
收件人:
var resource =
{
// "accountId": "177832616","resource":{
"name": "Test Property 7",// "dataRetentionResetOnNewActivity": false,"websiteUrl": "https://www.test.com"
}
}
注意:
- 如果
var resource = { "name": "Test Property 7","websiteUrl": "https://www.test.com" }
不正确,则会发生错误。请注意这一点。 - 在这种情况下,
accountId
中的request
从iansedano's comment直接返回值。这样您就可以看到类似var request = Analytics.Management.Webproperties.insert(resource,accountID);
和console.log(request)
的值。
参考:
- Web Properties: insert
joi验证:必填字段取决于ohers字段
Joi版本 17.2.1
我知道如何执行此操作的两个选择:
选项1
const joi = require('joi');
const schema = joi.object().keys({
a: joi.string(),b: joi.string(),c: joi.string(),d: joi.string(),})
.xor('a','c')
.xor('a','d')
.xor('b','c')
.xor('b','d')
.required();
选项2
const joi = require('joi');
const schema = joi.alternatives().try(
joi.object({
a: joi.string().required(),b: joi.string().required()
}),joi.object({
c: joi.string().required(),d: joi.string().required(),})
);
运行一些测试:
// should work
const aAndB = {
a: 'a',b: 'b'
};
console.log(schema.validate(aAndB).error);
// should work
const cAndD = {
c: 'c',d: 'd'
};
console.log(schema.validate(cAndD).error);
// should not work
const aAndC = {
a: 'a',c: 'c'
};
console.log(schema.validate(aAndC).error);
// should not work
const onlyA = {
a: 'a',};
console.log(schema.validate(onlyA).error);
// should not work
const onlyB = {
b: 'b',};
console.log(schema.validate(onlyB).error);
// should not work
const onlyC = {
c: 'c',};
console.log(schema.validate(onlyC).error);
// should not work
const onlyD = {
d: 'd',};
console.log(schema.validate(onlyD).error);
关于在Golang中解编json:必填字段?和golang json解析太蠢的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AngularJS:ng-show / ng-hide必填字段、Golang中使用JSON时区分空字段和未设置字段的方法、GoogleJsonResponseException:必填字段名称 发件人:收件人:注意:参考:、joi验证:必填字段取决于ohers字段等相关知识的信息别忘了在本站进行查找喔。
本文标签: