json解析对象时指定解析_不解析,使用解析对象

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解析对象时指定解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7设置键盘类型_CentOS 7 系统区域(语言)和键盘设置

即使是在window中,平常说的语言设置这一项也是归类为系统区域,CentOS可以通过修改/etc/locale.conf配置文件或使用localectl命令来进行设置,一般在安装时设置为默认选择(英文、美式键盘)即可。 修改locale.conf [root@localhost ~]#vim /etc/locale.conf LANG="en_US.U…

什么是公约数/公因数

公约数&#xff0c;亦称“公因数”。它是指能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公因数。 例如&#xff1a; 12 和 15…

vue对象拼接_vue 俩个数组对象合并成一个

情况是这样的后端给了几个接口数据 我合成一个 前端小白 勿喷 data(){return{list:[{date:20201, mc : 1 }, {date:20202, mc : 2 }, {date:20203, mc : 3 }, {date:20204, mc : 4, } ], newlist:[ {date:20201, mc : 6, age:12 }, {date:20202, mc : 3, age:12 }, {date:20203…

jdk8 获取上一个月时间_JDK 10:FutureTask获取一个toString()

jdk8 获取上一个月时间我已经很长时间了&#xff0c;对于大多数具有独特属性的Java类&#xff0c;开发人员应该花些时间重写Object.toString&#xff08;&#xff09; &#xff0c;即使它仅是由IDE生成的实现或使用诸如Apache之类的库类来实现Commons Lang的ToStringBuilder 。…

什么是质数

质数是指在大于1的自然数中&#xff0c;除了1和它本身以外不再有其他因数的自然数。 质数又称素数。一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数&#xff08;规定1既不是质数也不是合数&#xff09;。…

计算机网络笔记----应用层

应用层应用层协议原理网络应用程序的体系结构客户-服务器体系结构P2P体系结构进程通信进程与计算机网络之间的接口进程寻址可供应用程序使用的运输服务可靠数据传输吞吐量定时安全性因特网提供的运输服务TCP服务面向连接的服务可靠的数据传送服务拥塞控制TCP安全UDP服务应用层协…

js 导出pdf上传至oss_js实现oss文件上传及一些问题

关于兼容性问题&#xff0c;ie8以下的可以使用4.x的版本一、引入sdk和jq二、基本配置var client newOSS.Wrapper({region:,accessKeyId:‘,accessKeySecret:,bucket:})region&#xff1a;阿里云服务器地址accessKeyId&#xff1a;您的keyaccessKeySecret&#xff1a;您的密码&a…

缓冲池java_了解Java缓冲池

缓冲池java了解Java缓冲池 缓冲池空间位于垃圾收集器管理的内存之外。 这是分配本地堆外内存的一种方法。 使用缓冲池有什么好处&#xff1f; 为了回答这个问题&#xff0c;让我们首先了解什么是字节缓冲区。 字节缓冲区 非直接缓冲区 ByteBuffer类附带了java.nio包。 它允许我…

什么是合数

合数指自然数中除了能被1和本身整除外&#xff0c;还能被其他数&#xff08;0除外&#xff09;整除的数。 合数是指在大于1的整数中除了能被1和本身整除外&#xff0c;还能被其他数&#xff08;0除外&#xff09;整除的数。与之相对的是质数&#xff0c;而1既不属于质数也不属…

计算机网络应用层笔记--域名系统DNS

域名系统DNS标识因特网上主机的方式主机名IP地址域名系统(DNS)工作过程互联网的域名结构顶级域名国家顶级域名nTLD通用顶级域名gTLD基础结构域名二级域名类别域名行政区域名域名树DNS规定域名服务器域名服务器的层次根域名服务器顶级域名服务器(TLD服务器)权限域名服务器本地域…

protobuf3 自定义option_Protobuf3 语法指南

以前我翻译了 Protobuf2 语法指南&#xff0c;现在 千念飞羽把protobuf3的语法指南也翻译了&#xff0c;我也转载一下&#xff0c;读者可以有个参考。 译文地址是: Protobuf3语言指南。英文原文&#xff1a;Language Guide (proto3)中文出处&#xff1a;Protobuf语言指南[译]Pr…

web.xml.jsf_面向初学者的JSF 2.0教程

web.xml.jsf1.什么是JSF&#xff1f; JSF是Java Server Faces的首字母缩写。 它是一种服务器端处理技术&#xff0c;它允许将服务器端代码嵌入到网页中。 由于可以将服务器端处理和渲染代码嵌入网页本身&#xff0c;因此使项目的整体编码更加简单。 减少文件总数和大小。 JSF包…

0 是什么数

0 是最小的自然数0 是有理数0 既不是正数也不是负数&#xff0c;而是正数和负数的分界点0 是介于 -1 和 1 之间的整数0 不是奇数&#xff0c;而是偶数&#xff08;一个非正非负的特殊偶数&#xff09;0 不是质数&#xff0c;也不是合数0 在多位数中起占位作用&#xff0c;如108…

ubuntu下vscode使用cmake编译运行c++配置文件

在gcc/g能编译运行c的情况下&#xff0c;使用cmake编译只需要修改以下两个文件。 launch.json {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387"version&quo…

r语言mfrow全程_R语言中的色彩_LearningR - SegmentFault 思否

1. 基本颜色1.1 palette()1.1.1 palette的默认颜色palette()## [1] "black" "red" "green3" "blue" "cyan" "magenta" "yellow"## [8] "gray"pie(rep(1,8), colpalette(), border palette()…

java如何避免注释重复_Java 8中的可重复注释

java如何避免注释重复使用Java 8&#xff0c;您可以对声明或类型重复相同的注释。 例如&#xff0c;要注册一个类仅应由特定角色在运行时访问&#xff0c;则可以编写如下内容&#xff1a; Role("admin") Role("manager") public class AccountResource { …

什么是有理数

有理数是整数&#xff08;正整数、0、负整数&#xff09;和分数的统称&#xff0c;是整数和分数的集合。 整数也可看做是分母为一的分数。不是有理数的实数称为无理数&#xff0c;即无理数的小数部分是无限不循环的数。 正整数和正分数合称为正有理数&#xff0c;负整数和负分数…

Python中的符号

解释经常在python源码中看到的,->和:等符号。python在函数名或类名首字母用_来表示私有接口(仅供内部使用)。 标注 关联到某个变量、类属性、函数形参或返回值的标签&#xff0c;被约定作为类型提示来使用。 局部变量的标注在运行时不可访问&#xff0c;但全局变量、类属性…

java高可用grpc_GRPC java 分布式调用链跟踪实践

Opentracing基本模型image.png如图&#xff0c;在跟踪链中有以下几个比较重要的数据结构和概念&#xff1a;span&#xff1a;标识一次分布式调用&#xff0c;其自身包含了id&#xff0c;parentId(指向上级Span的id)&#xff0c; traceIds&#xff0c;服务名称等重要属性&#x…

jrebel gradle_JRebel适用于Gradle Spring Boot应用程序

jrebel gradle关于如何将JRebel添加到使用Gradle作为构建工具的Spring Boot应用程序中&#xff0c;有一些文档 。 它是基本的&#xff0c;但是效果很好。 您所要做的就是在build.gradle中添加几行&#xff1a; if (project.hasProperty(rebelAgent)) {bootRun.jvmArgs rebel…