golang 如何正确解析 Java 中 jackson 序列化的 json 数据?

239 天前
 ZeroDu
[
    "com.test.UserInfo",
    {
        "userName": "`13123",
        "email": "",
        "roleIds": [
            "java.util.ArrayList",
            [
                "109"
            ]
        ]
    }
]

如上,因为 jackson 在序列化时写入了类型信息,所以在 golang 中如何正确解析数据(忽略其中的类型信息)?

2454 次点击
所在节点    Go 编程语言
22 条回复
ZeroDu
224 天前
@layxy 首先这就是 json 。携带类型消息,可以放在单独字段,数组,对象等形式。你应该没有看过这里的 api
body007
222 天前
@ZeroDu #19

```go
package main

import (
"bytes"
"fmt"

jsoniter "github.com/json-iterator/go"
)

func main() {
s := `
[
"com.test.UserInfo",
{
"userName": "13123",
"email": "a@qq.com",
"roleIds": [
"java.util.ArrayList",
[
"109","209","309"
]
]
}
]`
var (
cnf = jsoniter.ConfigCompatibleWithStandardLibrary

buf bytes.Buffer
out = jsoniter.NewStream(cnf, &buf, 512)
)

recursivelyRemoveTypes(out, jsoniter.ParseString(cnf, s).ReadAny())
err := out.Flush()
if err != nil {
panic(err)
}

fmt.Println(buf.String())
}

func recursivelyRemoveTypes(out *jsoniter.Stream, data jsoniter.Any) {
switch data.ValueType() {
case jsoniter.ArrayValue:
if ds := data.Size(); ds > 0 {
if ds == 2 {
if data.Get(0).ToString() != "" {
recursivelyRemoveTypes(out, data.Get(1))
return
}
}

out.WriteArrayStart()
for i := 0; i < ds; i++ {
if i > 0 {
out.WriteMore()
}
recursivelyRemoveTypes(out, data.Get(i))
}
out.WriteArrayEnd()
} else {
out.WriteEmptyArray()
}
case jsoniter.ObjectValue:
if ks := data.Keys(); len(ks) > 0 {
out.WriteObjectStart()
for i, k := range ks {
if i > 0 {
out.WriteMore()
}
out.WriteObjectField(k)
recursivelyRemoveTypes(out, data.Get(k))
}
out.WriteObjectEnd()
} else {
out.WriteEmptyObject()
}
default:
data.WriteTo(out)
}
}
```

@a132811 你这个递归提醒了我,可以用上面方法不用解析 json 和序列化 json ,性能应该不错。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1107120

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX