json解析对象时指定解析

将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 ,这些对象在外出之前先序列化为JSON,然后在返回时反序列化。 这种方法很流行,而且是错误的。 序列化部分应该由打印机代替,我在前面已经解释过。 这是我对反序列化的看法,应该通过猜测对象来完成。

米歇尔·贡德里(Michel Gondry)的《科学》(La science desrêves)(2006)

假设有一个后端入口点,应该在库中注册一本新书,并以JSON格式到达:

{"title": "Object Thinking","isbn: "0735619654","author: "David West"
}

另外,还有一个类Library的对象,它希望将Book类型的对象赋予其方法register()

class Library {public void register(Book book) {// Create a new record in the database}
}

还可以说,类型Book有一个简单的方法isbn()

interface Book {String isbn();
}

现在,这是HTTP入口点(我正在使用Takes和Cactoos ),该入口点接受POST multipart/form-data请求并将书注册到库中:

public class TkUpload implements Take {private final Library library;@Overridepublic Response act(Request req) {String body = new RqPrint(new RqMtSmart(new RqMtBase(req)).single("book")).printBody();JsonObject json = Json.createReader(new InputStreamOf(body)).readObject();Book book = new BookDTO();book.setIsbn(json.getString("isbn"));library.register(book);}
}

这有什么问题? 好吧,几件事。

首先,它不可重用。 如果在其他地方需要类似的东西,我们将不得不再次编写此HTTP处理和JSON解析。

其次,错误处理和验证也不可重复使用。 如果将其添加到上述方法中,则必须将其复制到各处。 当然,DTO可以封装它,但这不是DTO通常的用途。

第三,以上代码具有相当的程序性,并且具有大量的时间耦合 。

更好的设计是将此解析隐藏在新类JsonBook

class JsonBook implements Book {private final String json;JsonBook(String body) {this.json = body;}@Overridepublic String isbn() {return Json.createReader(new InputStreamOf(body)).readObject().getString("isbn");}
}

然后,RESTful入口点将如下所示:

public class TkUpload implements Take {private final Library library;@Overridepublic Response act(Request req) {library.register(new JsonBook(new RqPrint(new RqMtSmart(new RqMtBase(req)).single("book")).printBody()));}
}

那不是更优雅吗?

下面是一些例子,从我的项目: RqUser从zerocracy /农场和RqUser从yegor256 / jare 。

从上面的示例中可以看到,有时我们不能使用implements因为Java中的某些原语不是接口而是final类: String是一个“完美”的示例。 这就是为什么我必须这样做:

class RqUser implements Scalar<String> {@Overridepublic String value() {// Parsing happens here and returns String}
}

但是除此之外,这些示例还完美地说明了上面建议的“解析对象”的原理。

翻译自: https://www.javacodegeeks.com/2018/03/dont-parse-use-parsing-objects.html

json解析对象时指定解析

json解析对象时指定解析_不解析,使用解析对象相关推荐

  1. 对象存储使用案例_连云数据都有“对象存储”了,你还是单身?

    没错,对象存储(OOS,Object-Oriented Storage)可不是一项"在你嫌男票/女票烦的时候暂时寄存的服务",而是中国电信为客户提供的一种海量.弹性.高可靠.高性价 ...

  2. python对象三个特性_百度资讯搜索_python对象三个特性

    金生水起程序猿 2020年11月22日 16:26大纲(面向对象的三大特性) 封装性继承性多态性 封装性 封装隐藏了对象的属性和方法内部实现细节,仅对外提供公共访问方式,类的内部可以访问,外部不可以访 ...

  3. date对象加十分钟_一张图讲解对象锁和关键字synchronized修饰方法(代码块)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 每个对象在出生的时候就有一把钥匙(监视器Monitor),那么被synchronized 修饰的方法相当于给方法加了一个锁 ...

  4. 微信小程序富文本解析点击图片放大_微信小程序解析富文本过程详解

    前言 最近公司在开发OTA微信小程序,一些页面的详情内容是HTML富文本格式的的,但是微信小程序不能直接解析HTML,需要将内容中的HTML标签转换成微信小程序所支持的标签. 开始的时候想过自己写方法 ...

  5. js对象数组计算总计_如何计算数组中的对象

    js对象数组计算总计 Knowing how to quickly iterate through an array and count objects is deceptively simple. ...

  6. feignclient对象找不到_领导同事争相介绍对象,相亲N次,我找不到一条结婚的理由...

    阅读前请点击"关注",每天2篇职场文章,陪你成长哦. 作者|杨小米 编辑|霄霄 来源|遇见小mi(ID:yujianxiaomi2015) 01 过去,我一直在写身边女朋友的相亲经 ...

  7. java对象的访问定位_深入理解java虚拟机---对象的访问定位(十)

    引用其他人的文章: https://www.cnblogs.com/YYfish/p/6722258.html 那是怎么访问对象呢? java 程序是通过栈上的reference数据来操作堆上的具体对 ...

  8. 对象存储使用案例_杉岩MOS海量对象存储中标福建移动

    近日,杉岩数据成功中标中国移动福建公司(以下简称福建移动)企业级IT云四期对象存储采购项目,将对接福建移动IT云资源池,对外提供对象存储服务.作为领先的综合智能信息服务运营商,近年来,中国移动福建公司 ...

  9. java 打印对象属性 工具类_关于java实现任意对象输出字符串的工具类ObjectUtils用户打印日志、接口调试及监控等...

    通过该对象工具类ObjectUtils(参考org.springframework.util.ObjectUtils)实现了类集.数组及基本数据类型转换及字符串输出,常用在日志输出打印.接口联调及对象 ...

最新文章

  1. 写自己的一个pdo数据库操作框架
  2. 汇编语言中,DS与BX有何区别?怎么搭配使用?(BX是通用寄存器)
  3. 岗位推荐 | 深圳大学胡瑞珍博士组招收计算机图形学访问硕士/博士
  4. 查表法生成流水号的示例.sql
  5. 简化Redis数据访问代码RedisTemplate
  6. 获取数据 - 下载附件解压附件 - Python代码
  7. 03、数据类型(02)
  8. 怎么让IIS支持PHP
  9. Python之subprocess模块
  10. android webview权限申请_Android应用开发之android 6.0下webview的定位权限设置方法
  11. Hadoop 集群 傻瓜式搭建手记 (一) 软件准备
  12. 别了,腾讯!别了,深圳!我去老家当富豪了!
  13. IOS15.4无法运行WebGL2.0问题
  14. uniapp小程序实现开屏页
  15. Addressable资源热更新疑问
  16. 最完整的磁性材料行业现状及发展前景分析,长文预警
  17. AutoGAN-Distiller: Searching to Compress Generative Adversarial Networks, ICML2020
  18. 【python】matplotlib.pyplot介绍
  19. 使用AMCap调整相机参数
  20. 电子商城后台系统(一):使用eclipse构建web项目

热门文章

  1. 10.31模拟:总结
  2. YbtOJ-交换游戏【树链剖分,线段树合并】
  3. 【DP】晨练计划(ybtoj)
  4. NOIP提高组复赛 知识点整理
  5. 练习利用LSTM实现手写数字分类任务
  6. MongoDB嵌套数组,多维数组查询
  7. Sentinel(二十三)之使用Apollo存储规则
  8. Spark入门(十八)之多表关联
  9. 汇编语言(十三)之偶数转成哥德巴赫猜想
  10. 设计数据库表时,你真的会选数据类型吗