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解析對象時指定解析
總結
以上是生活随笔為你收集整理的json解析对象时指定解析_不解析,使用解析对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 749局是真实存在的吗(中国749局简介
- 下一篇: 宏业快捷键锁定(宏业密码锁怎么使用)