Giter VIP home page Giter VIP logo

go.jsonvalue's People

Contributors

andrew-m-c avatar bluebugs avatar yzy-1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

go.jsonvalue's Issues

Panic when proceeding anonymous struct pointer

playground

package main

import (
	"fmt"

	jsonvalue "github.com/Andrew-M-C/go.jsonvalue"
)

func main() {
	type inner struct {
		Name string
	}
	type outer struct {
		*inner
		Age int
	}

	person := &outer{}
	person.inner = &inner{}
	person.Name = "Andrew"

	s := jsonvalue.New(person).MustMarshalString()

	fmt.Println(s)
}

Got:

panic: reflect: call of reflect.Value.NumField on ptr Value

goroutine 1 [running]:
reflect.flag.mustBe(...)
	/usr/local/go-faketime/src/reflect/value.go:221
reflect.Value.NumField({0x4c8b80?, 0xc000014300?, 0x7fb6d6408600?})
	/usr/local/go-faketime/src/reflect/value.go:1963 +0x8d
github.com/Andrew-M-C/go%2ejsonvalue.parseStructFieldValue({0x4c8b80?, 0xc000014300?, 0x7fb6d6403700?}, {{0x4c2865, 0x5}, {0x4c22eb, 0x4}, {0x50bc60, 0x4c8b80}, {0x0, ...}, ...}, ...)
	/tmp/gopath2056463688/pkg/mod/github.com/!andrew-!m-!c/[email protected]/import_export.go:345 +0x3da
github.com/Andrew-M-C/go%2ejsonvalue.parseStructValue({0x4d4560?, 0xc000014300?, 0x0?}, {0xe0?, 0x61?, 0x5d?})
	/tmp/gopath2056463688/pkg/mod/github.com/!andrew-!m-!c/[email protected]/import_export.go:321 +0x1d5
github.com/Andrew-M-C/go%2ejsonvalue.parsePtrValue({0x4c8bc0?, 0xc000014300?, 0x0?}, {0x8?, 0x32?, 0xa8?})
	/tmp/gopath2056463688/pkg/mod/github.com/!andrew-!m-!c/[email protected]/import_export.go:270 +0x12a
github.com/Andrew-M-C/go%2ejsonvalue.Import({0x4c8bc0, 0xc000014300}, {0x0?, 0x0?, 0x0?})
	/tmp/gopath2056463688/pkg/mod/github.com/!andrew-!m-!c/[email protected]/import_export.go:34 +0xfd
github.com/Andrew-M-C/go%2ejsonvalue.New(...)
	/tmp/gopath2056463688/pkg/mod/github.com/!andrew-!m-!c/[email protected]/new.go:19
main.main()
	/tmp/sandbox2041220080/prog.go:24 +0x99

正则作为value时的解析

有这样一个包含正则的json在解析时报错:

{"regexp": "^[a-zA-Z\d-]{3,5}$"}

这种情况应该怎么处理呢?

==========

{"regexp": "^[a-zA-Z\\d-]{3,5}$"}

呃,多加一个反斜杠时可以解析的。

当处理指针 struct 中的 array 时,nil pointer dereference

v1.3.2

type req struct {
IDs []uint64 `json:"ids,omitempty"`
}
type data struct {
Req *req `json:"req,omitempty"`
}

d := data{}
d.Req = &req{}
d.Req.IDs = []uint64{0}

j, err := Import(d)
so(err, isNil)

s := j.MustMarshalString()
so(s, eq, `{"req":{"ids":[0]}}`)

panic: runtime error: invalid memory address or nil pointer dereference

Boolean value support

  archived: false,

对于这种值好像Marshal的时候会丢失.变成:

  "archived":  ,

请问是哪个option可以控制的吗

time.Time marshaling not supported

https://go.dev/play/p/JvqKX_bNZ25

package main

import (
	"encoding/json"
	"fmt"
	"time"

	jsonvalue "github.com/Andrew-M-C/go.jsonvalue"
)

type st struct {
	Time time.Time
}

func main() {
	s := st{
		Time: time.UnixMilli(1678268209123),
	}

	b, _ := json.Marshal(s)
	str, _ := jsonvalue.New(s).MarshalString()

	fmt.Println(string(b))
	fmt.Println(str)
}

expected:

{"Time":"2023-03-08T09:36:49.123Z"}
{"Time":"2023-03-08T09:36:49.123Z"}

got:

{"Time":"2023-03-08T09:36:49.123Z"}
{"Time":{}}

对于 string 类型的 int,GetInt 未能识别到

package main

import (
	"fmt"
	
	jsonvalue "github.com/Andrew-M-C/go.jsonvalue"
)

func main() {
	txt := `{"source":"1024"}`
	v := jsonvalue.MustUnmarshalString(txt)
	src, _ := v.GetInt("source")
	
	fmt.Println(src)
}
  • expected: 1024
  • actual: 0

自己给自己提 bug,下一版本迭代修复

MustGet("key").Int()异常

package main

import (
	"fmt"
	jsonvalue "github.com/Andrew-M-C/go.jsonvalue"
)

func main() {
	raw := `{"number":""}`
	n := jsonvalue.MustUnmarshalString(raw)
	fmt.Println(n.MustGet("number").Int())
}

执行会报错
panic: runtime error: index out of range [0] with length 0

这个是设计就是如此还是非预期错误?

没有正确区分 float32 和 float64

package main

import (
	"encoding/json"
	"fmt"

	jsonvalue "github.com/Andrew-M-C/go.jsonvalue"
)

func main() {
	m := map[string]interface{}{
		"F32": float32(0.023),
		"F64": float64(0.023),
	}

	b, _ := json.Marshal(m)
	v, _ := jsonvalue.Import(m)

	fmt.Println(string(b))
	fmt.Println(v.MustMarshalString())
}

expected:

{"F32":0.023,"F64":0.023}
{"F32":0.023,"F64":0.023}

actual:

{"F32":0.023,"F64":0.023}
{"F32":0.023000000044703484,"F64":0.023}

version: v1.3.1

能否支持全局默认Option的修改?

首先这个库真的很好用,很顺手。

有一点在使用中显得比较繁琐的事情,就是对于默认 Option 无法满足需求的情况下,每次都要在 Marshal/Unmarshal 时打一堆选项。
有没有可能提供一个接口修改默认的 Option,这样只需要设置一次 Option。

在 struct 中嵌套 jsonvalue.V 之后,json.Marshal 时指定 option 不生效

playground:

package main

import (
	"encoding/json"
	"fmt"

	jsonvalue "github.com/Andrew-M-C/go.jsonvalue"
)

type myStruct struct {
	Ext *jsonvalue.V `json:"ext"`
}

func (s myStruct) MarshalJSON() ([]byte, error) {
	w := myStructWrapper(s)
	return jsonvalue.New(w).Marshal(jsonvalue.OptSetSequence())
}

type myStructWrapper myStruct

func main() {
	st := myStruct{
		Ext: jsonvalue.NewObject(),
	}

	st.Ext.SetString("1000").At("A")
	st.Ext.SetString("2000").At("B")

	const expected = `{"ext":{"A":"1000","B":"2000"}}`
	for i := range 2000 {
		b, _ := json.Marshal(st)
		if string(b) != expected {
			fmt.Println(string(b))
			fmt.Println(expected)

			panic(fmt.Sprintf("%d - diff!", i))
		}
	}
}

序列化的时候 "/" 会变成 "\/"

func Test_JsonVale(t *testing.T) { var m = map[string]interface{}{ "abc/123": "123", } v := jsonvalue.NewObject(m) s, _ := v.MarshalString() t.Log(s) }

expect {"abc/123":"123"}
get {"abc\/123":"123"}

在GIN中如何使用jsonvalue

在GIN里会使用以下代码对返回值进行赋值
c.JSON(http.StatusOK, gin.H{ "code": "A00000", "msg": "Operation Success", "data": gin.H{ "record": map[string]interface{}{}, }, })
这里的gin.H是一个map
type H map[string]interface{}
尝试了很久,都没有能够使用jsonvalue转换为这个格式,想请教下如何能做到呢?
顺便这库很好用,点个赞~
希望不要像fastjson那样出漏洞就好~

请大佬看看这个怎么出错了,谢谢!

package main

import (
"fmt"
"log"
"strings"

"github.com/Andrew-M-C/go.jsonvalue"

)

func main() {
fmt.Println("Hello World!")

strJson := []byte(`{"tunnels":[{"name":"command_line","uri":"/api/tunnels/command_line","public_url":"https://11111.ngrok.io","proto":"https","config":{"addr":"http://localhost:11111","inspect":true},"metrics":{"conns":{"count":1,"gauge":0,"rate1":5.456067032277228e-19,"rate5":0.0000016821504265361616,"rate15":0.00008846097772300972,"p50":8287268034,"p90":8287268034,"p95":8287268034,"p99":8287268034},"http":{"count":5,"rate1":2.5535363027836646e-18,"rate5":0.000008299538128664852,"rate15":0.0004403445395661658,"p50":427625,"p90":600127,"p95":600127,"p99":600127}}},{"name":"command_line (http)","uri":"/api/tunnels/command_line%20%28http%29","public_url":"http://11111.ngrok.io","proto":"http","config":{"addr":"http://localhost:11111","inspect":true},"metrics":{"conns":{"count":0,"gauge":0,"rate1":0,"rate5":0,"rate15":0,"p50":0,"p90":0,"p95":0,"p99":0},"http":{"count":0,"rate1":0,"rate5":0,"rate15":0,"p50":0,"p90":0,"p95":0,"p99":0}}}],"uri":"/api/tunnels"}`)
j, err := jsonvalue.Unmarshal(strJson)
if err != nil {
	log.Fatalf("Failed jsonvalue.Unmarshal : %s", err)

	return
}
bb, _ := j.GetString("tunnels", 0, "proto")
cc, _ := j.GetString("tunnels", 0, "public_url")
if "https" == bb {
	cc = strings.Replace(cc, "https://", "", -1)
} else if "http" == bb {
	cc = strings.Replace(cc, "http://", "", -1)
}
fmt.Println(string(cc))

}

错误为: unrecognized raw text, invalid character \u0065 at Position 246

注释、文档例程和实际代码有些出入

注释、文档例程是否和实际代码有些出入。实际代码返回了2个参数,文档和注释看起来是只返回1个参数。

go.jsonvalue/get.go

Lines 141 to 146 in a326e59

// GetString is equalivent to v, err := Get(...); v.String(). If error occurs, returns "".
//
// GetString 等效于 v, err := Get(...); v.String()。如果发生错误,则返回 ""。
func (v *V) GetString(firstParam any, otherParams ...any) (string, error) {
return v.getString(false, firstParam, otherParams...)
}

```go
const raw = `{"obj": {"obj": {"obj": {"str": "Hello, JSON!"}}}}`
s := jsonvalue.MustUnmarshalString(s).GetString("obj", "obj", "obj", "str")
fmt.Println(s)
```

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.