在JSON序列化中如何在Class1是Class2的字段的情况下如何忽略一些Class1字段? [英] In JSON serialization howto ignore some of Class1 field(s) in case Class1 is a field of Class2?

查看:91
本文介绍了在JSON序列化中如何在Class1是Class2的字段的情况下如何忽略一些Class1字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我如何忽略对象中的对象字段?

/ p>

我认为通过一个例子可以更容易理解:

(编者按: <code> Class1 </code> = <code> Engine </code> <code> Class2 </code> = <$ c $ <br/> <br/> </p><pre> <code> class Car {<br/>整数id;车辆</code>)</b> <br/>整数numberOfWheels; <br/>引擎引擎; <br/>} <br/> <br/>类引擎{<br/>整数ID; <br/>字符串名称; <br/>字符串生成器; <br/>整数horsePower; <br/>整数重量; <br/> <br/> $ / code> </pre><p> Car JSON应包含所有字段,但Car中的Engine对象对象应限制为<code> id,name,producer </code>。</p><pre> <code> {<br/>id:1,<br/>numberOfWheels:4,<br/>engine:{<br/>id:1,<br/>name:some engine <br/>producer:某个引擎生产者<br/>} <br/>} <br/> </code> </pre><p> <br/> <br/> <然而,引擎JSON应该包含所有字段<code> id,name,producer,horsePower,weight </code> </p><pre> <code> {<br/>id:1,<br/>name:some engine<br/>producer:一些引擎制作者<br/>horsePower :250 <br/>重量:500 <br/>} <br/> </code> </pre><p>澄清。只有在Car生成的JSON中才会忽略字段<code> horsePower </code>和<code> weight </code>。</p> <br/>看看<code> gson </code> s <code> JsonSerializer </code> </c> </和<code> ExclusionStrategy </code>。也许不是最简单的方法 - 特别是与你自己的解决方案相比 - 这是一个很好的选择。</p> <br/> <br/> <p>启用<code> Car <code>有一些特殊待遇创建<code> JsonSerializer </code> like </p><pre> <code>公共类CarSerializer实现了JsonSerializer< Car> {<br/> private final Gson gson = new GsonBuilder()<br/> .addSerializationExclusionStrategy(new FieldExclusionStrategy())。create(); <br/> <br/> @Override <br/> public JsonElement serialize(Car arg0,Type arg1,JsonSerializationContext arg2){<br/> return new JsonParser()。parse(gson.toJson(arg0)); <br/> <br/> <br/> $ / code $ / pre <br/> $ b $ p <p>上面有它自己的<code> gson </code>只能处理<code> Car </code>,而不能混淆其他序列化。前面提到的<code> ExclusionStrategy </code>指向它自己的私人用途,它检查如果<code> Car </code> s字段是<code> Engine </code>然后跳过<code> Engine </code>中的任何不需要的字段。</p><pre> <code> public class FieldExclusionStrategy实现ExclusionStrategy {<br/> private Set< String>忽略= <br/>新的HashSet< String>(Arrays.asList(new String [] {horsePower,weight})); <br/> @Override <br/> public boolean shouldSkipField(FieldAttributes arg0){<br/> if(arg0.getDeclaringClass()。isAssignableFrom(Engine.class))<br/> if(ignored.contains(arg0.getName ()))返回true; <br/>返回false; <br/>} <br/> @Override <br/> public boolean shouldSkipClass(Class<?> arg0){return false; } <br/>} <br/> </code> </pre><p>它可以与<code> gson <code>注册<code> JsonSerializer </code>作为它的类型适配器,用于<code> Car.class </code>:</p><pre> <code> Gson gson = new GsonBuilder()。setPrettyPrinting()<br/> .registerTypeAdapter(Car.class,new CarSerializer())。create(); <br/> </code> </pre><p> <br/><p>I searched for this question on stackoverflow and google and I couldn't find any proper answer.</p> <p>How do I ignore fields from an object within an object?</p> <p>I think it will be much easier to understand with an example:</p> <p>(Editors note, in title: <code>Class1</code>=<code>Engine</code> a field for <code>Class2</code>=<code>Car</code>)</p><pre><code>class Car { Integer id; Integer numberOfWheels; Engine engine; } class Engine { Integer id; String name; String producer; Integer horsePower; Integer weight; } </code></pre><p>The Car JSON should consist of all fields, but the Engine object within the Car object should be limited to <code>id, name, producer</code>.</p><pre><code>{ "id":1, "numberOfWheels":4, "engine": { "id":1, "name":"some engine" "producer":"some engine producer" } } </code></pre><p>The Engine JSON should however consist of all fields <code>id, name, producer, horsePower, weight</code></p><pre><code>{ "id":1, "name":"some engine" "producer":"some engine producer" "horsePower":250 "weight":500 } </code></pre><p>Just to clarify. The fields <code>horsePower</code> and <code>weight</code> should only be ignored in the JSON generated from Car.</p><div class="h2_lin"> 解决方案 </div><p>Have a look on <code>gson</code>s <code>JsonSerializer</code> and <code>ExclusionStrategy</code>. Maybe not the most terse way to do it - especially compared to your own solution - but a good option in general.</p> <p>To enable <code>Car</code> to have some special treatment create <code>JsonSerializer</code> like</p><pre><code>public class CarSerializer implements JsonSerializer<Car> { private final Gson gson = new GsonBuilder() .addSerializationExclusionStrategy(new FieldExclusionStrategy()).create(); @Override public JsonElement serialize(Car arg0, Type arg1, JsonSerializationContext arg2) { return new JsonParser().parse(gson.toJson(arg0)); } } </code></pre><p>Above has its own <code>gson</code> to handle only <code>Car</code> and not to mess any other serialization. Beforementioned registers <code>ExclusionStrategy</code> to its own private use that checks that if <code>Car</code>s field is <code>Engine</code> then any unwanted field in <code>Engine</code> is skipped.</p><pre><code>public class FieldExclusionStrategy implements ExclusionStrategy { private Set<String> ignored = new HashSet<String>(Arrays.asList( new String[]{"horsePower","weight"})); @Override public boolean shouldSkipField(FieldAttributes arg0) { if(arg0.getDeclaringClass().isAssignableFrom(Engine.class)) if(ignored.contains(arg0.getName())) return true; return false; } @Override public boolean shouldSkipClass(Class<?> arg0) { return false; } } </code></pre><p>And it can be used with <code>gson</code> that registers <code>JsonSerializer</code> as its type adapter for <code>Car.class</code>:</p><pre><code>Gson gson = new GsonBuilder().setPrettyPrinting() .registerTypeAdapter(Car.class, new CarSerializer()).create(); </code></pre><p> <p>这篇关于在JSON序列化中如何在Class1是Class2的字段的情况下如何忽略一些Class1字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!</p> </div> <div class="arc-body-main-more"> <span onclick="unlockarc('839847');">查看全文</span> </div> </div> <div> </div> <div class="wwads-cn wwads-horizontal" data-id="166" style="max-width:100%;border: 4px solid #666;"></div> </div> </article> <div id="arc-ad-2" class="mb-1"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5038752844014834" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5038752844014834" data-ad-slot="3921941283"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="widget bgwhite radius-1 mb-1 shadow widget-rel"> <h5>相关文章</h5> <ul> <li> <a target="_blank" title="如何从 class1 到 class2 设置文本?" href="/2324534.html"> 如何从 class1 到 class2 设置文本?; </a> </li> <li> <a target="_blank" title="Visual Studio 编译器警告 C4250(“class1":通过优势继承“class2::member")" href="/2773604.html"> Visual Studio 编译器警告 C4250(“class1":通过优势继承“class2::member"); </a> </li> <li> <a target="_blank" title="Visual Studio编译器警告C4250('class1':继承'class2 ::成员'通过dominance)" href="/459642.html"> Visual Studio编译器警告C4250('class1':继承'class2 ::成员'通过dominance); </a> </li> <li> <a target="_blank" title="如果在class1中检查了复选框,在class2中检查了settext texfield?" href="/1135056.html"> 如果在class1中检查了复选框,在class2中检查了settext texfield?; </a> </li> <li> <a target="_blank" title="我如何...在c#中的Class1中插入Ubdate_News" href="/1226899.html"> 我如何...在c#中的Class1中插入Ubdate_News; </a> </li> <li> <a target="_blank" title="如何将class1复选框选择的值获取到class 2,Visual C#中?" href="/1438776.html"> 如何将class1复选框选择的值获取到class 2,Visual C#中?; </a> </li> <li> <a target="_blank" title="Insert是一个变量,但其用法类似于方法-从Main Class调用class1" href="/1644950.html"> Insert是一个变量,但其用法类似于方法-从Main Class调用class1; </a> </li> <li> <a target="_blank" title="如何在另一个类中使用在class1中创建的变量?" href="/1972521.html"> 如何在另一个类中使用在class1中创建的变量?; </a> </li> <li> <a target="_blank" title="如何将多行数据绑定到class1对象" href="/1187064.html"> 如何将多行数据绑定到class1对象; </a> </li> <li> <a target="_blank" title="如何在control1或form1中从class2触发事件?" href="/1085073.html"> 如何在control1或form1中从class2触发事件?; </a> </li> <li> <a target="_blank" title="Swift:创建一个调用另一个class1中的方法的按钮" href="/930514.html"> Swift:创建一个调用另一个class1中的方法的按钮; </a> </li> <li> <a target="_blank" title="如何反序列化json属性为class属性?" href="/1512808.html"> 如何反序列化json属性为class属性?; </a> </li> <li> <a target="_blank" title=".class 是方法还是字段?" href="/2652776.html"> .class 是方法还是字段?; </a> </li> <li> <a target="_blank" title="参数 5:无法从“System.Drawing.Image"转换为“string" - 从主类调用 class1" href="/2305317.html"> 参数 5:无法从“System.Drawing.Image"转换为“string" - 从主类调用 class1; </a> </li> <li> <a target="_blank" title=".class是一个方法还是字段?" href="/511292.html"> .class是一个方法还是字段?; </a> </li> <li> <a target="_blank" title="如何填充Class对象以进行序列化和反序列化。" href="/1198638.html"> 如何填充Class对象以进行序列化和反序列化。; </a> </li> <li> <a target="_blank" title="SonarLint V3:“可序列化”字段中的字段对于List接口,class应该是瞬态的或可序列化的" href="/908215.html"> SonarLint V3:“可序列化”字段中的字段对于List接口,class应该是瞬态的或可序列化的; </a> </li> <li> <a target="_blank" title="Play Framework - 如何忽略 Json 序列化的某些字段?" href="/2335636.html"> Play Framework - 如何忽略 Json 序列化的某些字段?; </a> </li> <li> <a target="_blank" title="让Django在没有“字段"的情况下序列化对象场地" href="/1505838.html"> 让Django在没有“字段"的情况下序列化对象场地; </a> </li> <li> <a target="_blank" title="无法反序列化 ExecutionContext:具有 [... Class] 且名称为 [... Class] 的类不受信任" href="/2407234.html"> 无法反序列化 ExecutionContext:具有 [... Class] 且名称为 [... Class] 的类不受信任; </a> </li> <li> <a target="_blank" title="Gson:如何在没有注释的情况下从序列化中排除特定字段" href="/839324.html"> Gson:如何在没有注释的情况下从序列化中排除特定字段; </a> </li> <li> <a target="_blank" title="Gson:如何在没有注释的情况下从序列化中排除特定字段" href="/2605382.html"> Gson:如何在没有注释的情况下从序列化中排除特定字段; </a> </li> <li> <a target="_blank" title="为什么classname $ 1.class在这种情况下生成?" href="/538871.html"> 为什么classname $ 1.class在这种情况下生成?; </a> </li> <li> <a target="_blank" title="在联接laravel中使用表2字段值更新表1字段" href="/1544070.html"> 在联接laravel中使用表2字段值更新表1字段; </a> </li> <li> <a target="_blank" title="如何在Python中使json.dumps忽略不可序列化的字段" href="/2155120.html"> 如何在Python中使json.dumps忽略不可序列化的字段; </a> </li> </ul> </div> <div class="mb-1"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5038752844014834" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5038752844014834" data-ad-slot="3921941283"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="side"> <div class="widget widget-side bgwhite mb-1 shadow"> <h5>Java开发最新文章</h5> <ul> <li> <a target="_blank" title="Tomcat 404错误:原始服务器没有找到目标资源的当前表示,或者不愿意透露该目录的存在" href="/664384.html"> Tomcat 404错误:原始服务器没有找到目标资源的当前表示,或者不愿意透露该目录的存在; </a> </li> <li> <a target="_blank" title="由于缺少ServletWebServerFactory bean,无法启动ServletWebServerApplicationContext" href="/908134.html"> 由于缺少ServletWebServerFactory bean,无法启动ServletWebServerApplicationContext; </a> </li> <li> <a target="_blank" title="无法反序列化的java.util.ArrayList实例出来VALUE_STRING的" href="/231593.html"> 无法反序列化的java.util.ArrayList实例出来VALUE_STRING的; </a> </li> <li> <a target="_blank" title="什么是AssertionError?在这种情况下,我应该从我自己的代码中抛出?" href="/741560.html"> 什么是AssertionError?在这种情况下,我应该从我自己的代码中抛出?; </a> </li> <li> <a target="_blank" title="JSON反序列化投掷例外 - 无法反序列化的java.util.ArrayList实例出来START_OBJECT令牌" href="/232414.html"> JSON反序列化投掷例外 - 无法反序列化的java.util.ArrayList实例出来START_OBJECT令牌; </a> </li> <li> <a target="_blank" title="Maven构建错误 - 无法执行目标org.apache.maven.plugins:Maven的组装插件:2.5.5" href="/345036.html"> Maven构建错误 - 无法执行目标org.apache.maven.plugins:Maven的组装插件:2.5.5; </a> </li> <li> <a target="_blank" title="正确使用Optional.ifPresent()" href="/998833.html"> 正确使用Optional.ifPresent(); </a> </li> <li> <a target="_blank" title="获取异常(org.apache.poi.openxml4j.exception - 没有内容类型[M1.13])阅读使用Apache POI XLSX文件时?" href="/219241.html"> 获取异常(org.apache.poi.openxml4j.exception - 没有内容类型[M1.13])阅读使用Apache POI XLSX文件时?; </a> </li> <li> <a target="_blank" title="SpringBoot - 制作jar文件 - 在META-INF / spring.factories中找不到自动配置类" href="/907745.html"> SpringBoot - 制作jar文件 - 在META-INF / spring.factories中找不到自动配置类; </a> </li> <li> <a target="_blank" title="HTTP状态404 - 请求的资源(/)不可用" href="/659888.html"> HTTP状态404 - 请求的资源(/)不可用; </a> </li> </ul> </div> <div class="widget widget-side bgwhite mb-1 shadow"> <h5> 热门教程 </h5> <ul> <li> <a target="_blank" title="Java教程" href="/OnLineTutorial/java/index.html"> Java教程 </a> </li> <li> <a target="_blank" title="Apache ANT 教程" href="/OnLineTutorial/ant/index.html"> Apache ANT 教程 </a> </li> <li> <a target="_blank" title="Kali Linux教程" href="/OnLineTutorial/kali_linux/index.html"> Kali Linux教程 </a> </li> <li> <a target="_blank" title="JavaScript教程" href="/OnLineTutorial/javascript/index.html"> JavaScript教程 </a> </li> <li> <a target="_blank" title="JavaFx教程" href="/OnLineTutorial/javafx/index.html"> JavaFx教程 </a> </li> <li> <a target="_blank" title="MFC 教程" href="/OnLineTutorial/mfc/index.html"> MFC 教程 </a> </li> <li> <a target="_blank" title="Apache HTTP客户端教程" href="/OnLineTutorial/apache_httpclient/index.html"> Apache HTTP客户端教程 </a> </li> <li> <a target="_blank" title="Microsoft Visio 教程" href="/OnLineTutorial/microsoft_visio/index.html"> Microsoft Visio 教程 </a> </li> </ul> </div> <div class="widget widget-side bgwhite mb-1 shadow"> <h5> 热门工具 </h5> <ul> <li> <a target="_blank" title="Java 在线工具" href="/Onlinetools/details/4"> Java 在线工具 </a> </li> <li> <a target="_blank" title="C(GCC) 在线工具" href="/Onlinetools/details/6"> C(GCC) 在线工具 </a> </li> <li> <a target="_blank" title="PHP 在线工具" href="/Onlinetools/details/8"> PHP 在线工具 </a> </li> <li> <a target="_blank" title="C# 在线工具" href="/Onlinetools/details/1"> C# 在线工具 </a> </li> <li> <a target="_blank" title="Python 在线工具" href="/Onlinetools/details/5"> Python 在线工具 </a> </li> <li> <a target="_blank" title="MySQL 在线工具" href="/Onlinetools/Dbdetails/33"> MySQL 在线工具 </a> </li> <li> <a target="_blank" title="VB.NET 在线工具" href="/Onlinetools/details/2"> VB.NET 在线工具 </a> </li> <li> <a target="_blank" title="Lua 在线工具" href="/Onlinetools/details/14"> Lua 在线工具 </a> </li> <li> <a target="_blank" title="Oracle 在线工具" href="/Onlinetools/Dbdetails/35"> Oracle 在线工具 </a> </li> <li> <a target="_blank" title="C++(GCC) 在线工具" href="/Onlinetools/details/7"> C++(GCC) 在线工具 </a> </li> <li> <a target="_blank" title="Go 在线工具" href="/Onlinetools/details/20"> Go 在线工具 </a> </li> <li> <a target="_blank" title="Fortran 在线工具" href="/Onlinetools/details/45"> Fortran 在线工具 </a> </li> </ul> </div> </div> </div> <script type="text/javascript">var eskeys = '在,json,序列化,中,如,何在,class1,是,class2,的,字段,的,情况下,如何,忽略,一些,class1,字段'; var cat = 'cc';';//java</script> </div> <div id="pop" onclick="pophide();"> <div id="pop_body" onclick="event.stopPropagation();"> <h6 class="flex flex101"> 登录 <span onclick="pophide();">关闭</span> </h6> <div class="pd-1"> <div class="wxtip center"> <span>扫码关注<em>1秒</em>登录</span> </div> <div class="center"> <img id="qr" src="https://huajiakeji.com/Content/Images/qrydx.jpg" alt="" style="width:150px;height:150px;" /> </div> <div style="margin-top:10px;display:flex;justify-content: center;"> <input type="text" placeholder="输入验证码" id="txtcode" autocomplete="off" /> <input id="btngo" type="button" onclick="chk()" value="GO" /> </div> <div class="center" style="margin: 4px; font-size: .8rem; color: #f60;"> 发送“验证码”获取 <em style="padding: 0 .5rem;">|</em> <span style="color: #01a05c;">15天全站免登陆</span> </div> <div id="chkinfo" class="tip"></div> </div> </div> </div> <script type="text/javascript" src="https://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js"></script> <script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/highlight.min.js"></script> <script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/base.js?v=0.22"></script> <script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/tui.js?v=0.11"></script> <footer class="footer"> <div class="container"> <div class="flink mb-1"> 友情链接: <a href="https://www.it1352.com/" target="_blank">IT屋</a> <a href="https://huajiakeji.com/" target="_blank">Chrome插件</a> <a href="https://www.cnplugins.com/" target="_blank">谷歌浏览器插件</a> </div> <section class="copyright-section"> <a href="https://www.it1352.com" title="IT屋-程序员软件开发技术分享社区">IT屋</a> ©2016-2022 <a href="http://www.beian.miit.gov.cn/" target="_blank">琼ICP备2021000895号-1</a> <a href="/sitemap.html" target="_blank" title="站点地图">站点地图</a> <a href="/Home/Tags" target="_blank" title="站点标签">站点标签</a> <a target="_blank" alt="sitemap" href="/sitemap.xml">SiteMap</a> <a href="/1155981.html" title="IT屋-免责申明"><免责申明></a> 本站内容来源互联网,如果侵犯您的权益请联系我们删除. </section> <!--统计代码--> <script type="text/javascript"> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?0c3a090f7b3c4ad458ac1296cb5cc779"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script type="text/javascript"> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </div> </footer> </body> </html>