Jackson全面解析--注解全讲解十二(动态添加字段@JsonAppend)

Jackson全面解析--注解全讲解十二(动态添加字段@JsonAppend),第1张

有时候我们需要在不改变类的属性字段的情况下,添加字段,Jackson提供了@JsonAppend注解来实现这个功能,使用方式如下

通过上面的例子可以看到,@JsonAppend提供了两种方式来动态的添加虚拟字段

1 attrs

此种方式需要在序列化时候手动的添加Attribute,如下

om.writerFor(CombineJacksonAnnotation.JsonPropertyPojo.class).withAttribute("age","10").withAttribute("height","12")

2 props

此种方式比较灵活,但是要实现一个VirtualBeanPropertyWriter类即可,如果真的有这种需求,推荐使用第二种方式来实现

Go 语言是静态类型语言,虽然它也可以表现出动态类型,但是使用一个嵌套的 map[string]interface{} 在那里乱叫会让代码变得特别丑。通过掌握语言的静态特性,我们可以做的更好。

通过同一通道交换多种信息的时候,我们经常需要 JSON 具有动态的,或者更合适的参数内容。首先,让我们来讨论一下消息封装(message envelopes),JSON 在这里看起来就像这样:

通过 interface{},我们可以很容易的将数据结构编码成为独立封装的,具有多种类型的消息体的 JSON 数据。为了生成下面的 JSON :

我们可以使用这些 Go 类型:

输出的结果是:

这些并没有什么特殊的。

如果你想将上面的 JSON 对象解析成为一个 Envelope 类型的对象,最终你会将 Msg 字段解析成为一个 map[string]interface{}。 这种方式不是很好用,会使你后悔你的选择。

输出:

就像前面说的,我推荐修改 Envelope 类型,就像这样:

json.RawMessage 非常有用,它可以让你延迟解析相应的 JSON 数据。它会将未处理的数据存储为 []byte。

这种方式可以让你显式控制 Msg 的解析。从而延迟到获取到 Type 的值之后,依据 Type 的值进行解析。这种方式不好的地方在于你需要先明确解析 Msg,或者你需要单独分为 EnvelopeIn 和 EnvelopeOut 两种类型,其中 EnvelopeOut 仍然有 Msg interface{}。

那么如何将上述两者好的一面结合起来呢?通过在 interface{} 字段中放入 *json.RawMessage!

输出:

虽然我极其推荐你将动态可变的部分放在一个单独的 key 下面,但是有时你可能需要处理一些预先存在的数据,它们并没有用这样的方式进行格式化。

如果可以的话,请使用文章前面提到的风格。

我们可以通过解析两次数据的方式来解决。

dynamite

json追加内容并且修改和删除 *** 作示例:

1、增加:

myObj.user='我是新增的用户-小明'

x+="<h1>增加后的数据</h1>"forin()

2、修改:

myObj.name="我的网站"

x+="<h1>修改后的数据</h1>"forin()

3、删除:

deletemyObj.sites

x+="<h1>删除后的数据</h1>"forin()

扩展资料

JS动态动态创建JSON数据字符串,并且可以删除添加修改

<scripttype="text/javascript">

//添加或者修改json数据

functionsetJson(jsonStr,name,value)

{

if(!jsonStr)jsonStr="{}"

varjsonObj=JSON.parse(jsonStr)

jsonObj[name]=value

returnJSON.stringify(jsonObj)

}

//删除数据

functiondeleteJson(jsonStr,name)

{

if(!jsonStr)returnnull

varjsonObj=JSON.parse(jsonStr)

deletejsonObj[name]

returnJSON.stringify(jsonObj)

}

//生成测试

varmyjsonStr=setJson(null,"name","aaa")

alert(myjsonStr)

//添加测试

myjsonStr=setJson(myjsonStr,"age",18)

alert(myjsonStr)

//修改测试

myjsonStr=setJson(myjsonStr,"age",20)

alert(myjsonStr)

//删除测试

myjsonStr=deleteJson(myjsonStr,"age")

alert(myjsonStr)

</script>


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7905953.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-11
下一篇2023-04-11

发表评论

登录后才能评论

评论列表(0条)

    保存