V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wwwuser  ›  全部回复第 1 页 / 共 1 页
回复总数  19
ZGR2dmpkNTJv
不正常
@Jinnmki 一语点醒梦中人,我从来不用黑色主题,我试下看看
@hello158 谢谢,在深圳这边儿
@byuan04 你眼睛真好,果然基因强大,我是很苦恼,你用久了不会散光,眼干涩吗
@digman 这真是个好点子,我研究下
@minami 驱动解决,感谢
@NoOneNoBody 好的,下次会注意的
@kuanat 资深玩家,科普的也是挺深刻的
@ityspace 干掉了 MacOS 吗
@xclrr
@klesh 看来是目前的真知灼见了,那等稳定成熟了再折腾了吧
@shz123 文章没有提供简单的删除方法☹️
@FreddyLiu 好多 utunX 的网卡,找了半天没找到删除的方法,之前没注意有这么多
106 天前
回复了 shervy 创建的主题 Apple 做个调查:升级 macOS14 的体验
4 、Air 时不时无法唤醒,有没有改善这一严重问题, 这一点儿是 MacBook Air m2 屏幕硬件问题,我的已经更换屏幕和角度传感器,目前没有无法唤醒的问题
144 天前
回复了 freewarcraft 创建的主题 MacBook Air M2 的 MacBook Air 近期偶尔睡死怎么回事
@ibowen 一样的问题,已检测,待送修,估计是一样的问题
144 天前
回复了 OrangeLoveMilan 创建的主题 Apple MBA M2 睡眠后无法唤醒
@houpe 处理好了吗,换了哪些配件呢
@zhs227
@BeautifulSoap
@ye4tar

看了官方的文档避开那个坑就可以了,不需要改官方库,下面的代码可以校验原始 json 对象是否有 null 值,可以直接跑着测试一下,可能考虑不周全,可以一起完善下,献丑了


package main

import (
"encoding/json"
"fmt"
)

func main() {
data := []byte(`{
"id": 1,
"name": "zhangSheng",
"books": [{
"id": 1,
"Name": 2,
"desc": "golang book",
"err": ["a","b"],
"array": [{"a":"hello","b": null}]
}],
"desc": "test",
"test": {"a": "s"}
}`)

var jsonMap map[string]interface{}
if err := json.Unmarshal(data, &jsonMap); err != nil {
fmt.Println(err.Error())
return
}
println(valueHasNil(jsonMap))
}

func valueHasNil(mp map[string]interface{}) bool {
for key, value := range mp {
if value == nil {
fmt.Printf("key: %s, value: %+v\n", key, value)
return true
}
switch val := value.(type) {
case []interface{}:
for _, m := range val {
switch t := m.(type) {
case map[string]interface{}:
if valueHasNil(t) {
return true
}
}
}
case map[string]interface{}:
if valueHasNil(val) {
return true
}
}
}
return false
}
// The JSON null value unmarshals into an interface, map, pointer, or slice
// by setting that Go value to nil. Because null is often used in JSON to mean
// “not present,” unmarshaling a JSON null into any other Go type has no effect
// on the value and produces no error.
所以先把原始 json 数据想办法 unmarshal 到 interface, map, pointer, or slice 这些里面做个校验就行,改官方包也算是一种方法吧, 只是觉得没必要大动干戈改官方包。
也就 Unmarshal 到非 interface{} 会产生 null 和 0 分辨不清楚,所以先 Unmarshal 到 interface{}, 做一下校验就 OK 了,没必要改官方包
看了下官方 Unmarshal 的规则,// To unmarshal JSON into an interface value,
// Unmarshal stores one of these in the interface value:
//
// bool, for JSON booleans
// float64, for JSON numbers
// string, for JSON strings
// []interface{}, for JSON arrays
// map[string]interface{}, for JSON objects
// nil for JSON null
//
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2566 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 24ms · UTC 02:51 · PVG 10:51 · LAX 19:51 · JFK 22:51
Developed with CodeLauncher
♥ Do have faith in what you're doing.