V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wwwuser  ›  全部回复第 3 页 / 共 3 页
回复总数  45
1  2  3  
361 天前
回复了 OrangeLoveMilan 创建的主题 Apple MBA M2 睡眠后无法唤醒
@houpe 处理好了吗,换了哪些配件呢
2023-09-21 17:53:11 +08:00
回复了 BeautifulSoap 创建的主题 Go 编程语言 踩到 Go 的 json 解析坑了,如何才能严格解析 json?
@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
}
2023-09-21 11:50:35 +08:00
回复了 BeautifulSoap 创建的主题 Go 编程语言 踩到 Go 的 json 解析坑了,如何才能严格解析 json?
// 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 这些里面做个校验就行,改官方包也算是一种方法吧, 只是觉得没必要大动干戈改官方包。
2023-09-21 11:44:41 +08:00
回复了 BeautifulSoap 创建的主题 Go 编程语言 踩到 Go 的 json 解析坑了,如何才能严格解析 json?
也就 Unmarshal 到非 interface{} 会产生 null 和 0 分辨不清楚,所以先 Unmarshal 到 interface{}, 做一下校验就 OK 了,没必要改官方包
2023-09-21 11:41:16 +08:00
回复了 BeautifulSoap 创建的主题 Go 编程语言 踩到 Go 的 json 解析坑了,如何才能严格解析 json?
看了下官方 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
//
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2810 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 02:59 · PVG 10:59 · LAX 18:59 · JFK 21:59
Developed with CodeLauncher
♥ Do have faith in what you're doing.