www.91084.com

GVKun编程网logo

在Golang中解编json:必填字段?(golang json解析太蠢)

15

在这篇文章中,我们将为您详细介绍在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解析太蠢)

在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必填字段

AngularJS:ng-show / ng-hide必填字段

我试图使用ng-show / ng-hide显示/隐藏必填字段,除非选中输入以显示字段.但是,表单不会提交,因为需要隐藏字段(除非我选择查看隐藏的附加字段的选项).我在必填字段上使用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"/>

解决方法

你可以使用ng-required,它会设置所需的属性,并与输入模型的已检查的boleon相对应

<input type="number" ng-required="{{checked}}"id="inputamount"
 data-ng-model="itemamount" step="any" ng-show="checked"/>

Golang中使用JSON时区分空字段和未设置字段的方法

Golang中使用JSON时区分空字段和未设置字段的方法

                                                       

下面由golang教程栏目给大家介绍Golang中使用JSON时区分空字段和未设置字段的方法,希望对需要的朋友有所帮助!

go

几周前, 我在使用 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: &#39;%s&#39; ",*a.Name)
   }
   if u.Desc!=nil{
   output+=fmt.Sprintf("Desc: &#39;%s&#39; ",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:必填字段名称 发件人:收件人:注意:参考:

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验证:必填字段取决于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字段等相关知识的信息别忘了在本站进行查找喔。

本文标签: