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

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

举报· 1648 次点击
登录 注册 站外分享
15 条回复  
jov1 小成 3 小时前
这个数据看起来更像是对序列化后的对象做了 toString()操作返回的字符串,肯定不是标准的 json ,即便带有类信息比如存到 redis ,使用 jackson 序列化完也应该是这样的结构,不会出现 "java.util.ArrayList"这种的 { "@type": "com.xxx.xxx.XXX", "ids": [ 111,22 ], "name": "你好" }
guyeu 小成 3 小时前
最好让上游改一下序列化方式,把类型信息当作字段放进 json ,如 ```json { "@type": "com.test.UserInfo", "userName": "`13123", "email": "", "roleIds": [ "java.util.ArrayList", [ "109" ] ] } ``` 这样你只需要简单配置下自己这边的反序列化器忽略`@type`字段(很多时候也不需要配置,json 库默认忽略不认识的字段)。
guyeu 小成 3 小时前
我说的这个修改需要上游改一下这个类上`@JsonTypeInfo`注解的属性,或者修改下自己的`ObjectMapper`。
guyeu 小成 2 小时前
u1s1 ,Jackson 把多态对象的类型信息当作数组的元素序列化的方式略微少见,正经的 API 还是尽可能避免使用多态数据,或者专门定义一个描述类型信息的枚举,然后根据这个枚举来序列化/反序列化,使用 Jackson 也可以较简单地实现这样的机制。
zhuisui 小成 2 小时前
``` // nodejs Buffer > Buffer.from([1]).toJSON() { type: 'Buffer', data: [ 1 ] } ``` 特定类型的对象 json 序列化结果本来就依赖于类型,默认行为只会考虑本平台的反序列化。 要想跨平台识别,必须自定义序列化结果。 json 本身只是信息携带标准格式,没什么非法不非法一说。
body007 初学 2 小时前
我这边是用 github.com/json-iterator/go 这个库的 jsoniter.Get 方法,示例如下,我是默认 "com.test.UserInfo" 和 "java.util.ArrayList" 这类数据都在第 0 项里面,所以用 data.Get(1) 取第 1 项。 ```go package main import ( "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" ] ] } ]` data := jsoniter.Get([]byte(s), 1) var ( userName = data.Get("userName").ToString() email = data.Get("email").ToString() roleIds []string ) data.Get("roleIds", 1).ToVal(&roleIds) fmt.Printf("userName: %s, email: %s, roleIds: %#v\n", userName, email, roleIds) } ```
fengjianche 初学 2 小时前
json 不是都一样的吗?怎么还跟语言有关系
git00ll 初学 2 小时前
让上游不要吧类型搞出来,这不是标准的 json
Erroad 小成 2 小时前
说明没做好序列化,变成了一堆 Object 或者说 interface 的数组
12下一页
返回顶部