当前位置: 首页 > news >正文

平阳县住房和城乡规划建设局网站如何用网站做淘宝客

平阳县住房和城乡规划建设局网站,如何用网站做淘宝客,手机怎样建设网站,广州建筑公司招聘网站源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库#xff0c;它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本#xff0c;即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压…源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压地址为https://github.com/alibaba/fastjson/releases/tag/1.2.83 项目结构 使用 IDEA 打开 fastjson-1.2.83 文件夹下载相关依赖后我们再开始阅读源码接下来我们分别对 JSON 、JSONArray 与 JSONObject。 JSON 实现两个接口 JSON 类是实现两个接口 JSONStreamAware 、JSONAware 的抽象类即 public abstract class JSON implements JSONStreamAware, JSONAware 我们先介绍这两个接口 JSONStreamAware 方法 writeJSONString 中的参数 Appendable 也是一个接口也就是可以附加字符序列和值的对象这个接口的作用是提供一个输出JSON字符串的方法以便于其他的方法调用。 接着我们在 JSON 抽象类中寻找用到这个方法的地方这里主要截图其中两个具体的实现方法另外还有几个重载方法是通过调用这两个方法的方法这里不再列举。 JSONAware 这个接口更加简单了实现该接口的类即需要实现 toJSONString 的方法即可。 在JSON抽象类中具体实现为 这里调用的是 JSONSerializer 类的对象方法这里我们在后面介绍这个类的时候进一步介绍。 这个相对于 writeJSONString 更加实用。比如重写 toString 方法。 JSON 类的静态方法 我们常常用到这些方法并且我们在使用 JSONObject 类方法的时候也经常用得到JSONObject是JSON类的子类。这里我们介绍我们最最最常用的并且在 JSONObject 中不再介绍。 JSON.toString / JSON.toJSONString 这个方法前面关于 JSONAware 接口的实现的时候有提到过这里就不做介绍了。 这里我们看一下 toJSONString 方法的实现原理。源码比较简单这里就不逐行介绍了。 方法参数介绍 object: Object 待转换的 Java 对象defaultFeatures: int 后面参数 SerializerFeature 的长度因为后面是 SerializerFeature... 类型的所以调用时需要指定它的长度features: SerializerFeature… 这个地方是指多个 SerializerFeature 类型的对象调用时可以 toJSONString(obj, 1, feature0) 也可以 toJSONString(obj, 2, feature0, feature1)也可以 toJSONString(obj, 3, feature0, feature1, feature2) 等等。 /*** since 1.2.11*/public static String toJSONString(Object object, int defaultFeatures, SerializerFeature... features) {SerializeWriter out new SerializeWriter((Writer) null, defaultFeatures, features);try {JSONSerializer serializer new JSONSerializer(out);serializer.write(object);String outString out.toString();int len outString.length();if (len 0 outString.charAt(len -1) . object instanceof Number !out.isEnabled(SerializerFeature.WriteClassName)) {return outString.substring(0, len - 1);}return outString;} finally {out.close();}}源码中用到了 SerializeWriter 对象以及它的方法这里我们理一下它的作用与用法。 SerializeWriter 构造函数为 public SerializeWriter(Writer writer, int defaultFeatures, SerializerFeature... features){this.writer writer;buf bufLocal.get();if (buf ! null) {bufLocal.set(null);} else {buf new char[2048];}int featuresValue defaultFeatures;for (SerializerFeature feature : features) {featuresValue | feature.getMask();}this.features featuresValue;computeFeatures();}在前面初始化JSONSerializer的时候调用SerializeWriter对象即 JSONSerializer serializer new JSONSerializer(out); 这个时候的使用方法是 这里查看 JSONSerializer 对象的构造函数 public JSONSerializer(SerializeWriter out){this(out, SerializeConfig.getGlobalInstance());}public JSONSerializer(SerializeWriter out, SerializeConfig config){this.out out;this.config config;}其 write 方法源码为 public final void write(Object object) {if (object null) {out.writeNull();return;}Class? clazz object.getClass();ObjectSerializer writer getObjectWriter(clazz);try {writer.write(this, object, null, null, 0);} catch (IOException e) {throw new JSONException(e.getMessage(), e);}}JSONObject 相对而言 JSONObject 用得更多这里需要介绍的也更多。 无参构造函数 其中 DEFAULT_INITIAL_CAPACITY 默认等于 16也就是创建 HashMap 或者 LinkedHashMap 对象的时候默认的 initialCapacity 的值而 order 参数将会指定创建的 map 对象的类型。 public JSONObject(){this(DEFAULT_INITIAL_CAPACITY, false);}public JSONObject(int initialCapacity, boolean ordered){if (ordered) {map new LinkedHashMapString, Object(initialCapacity);} else {map new HashMapString, Object(initialCapacity);}}public JSONObject(boolean ordered){this(DEFAULT_INITIAL_CAPACITY, ordered);}public JSONObject(int initialCapacity){this(initialCapacity, false);} 有参构函数 public JSONObject(MapString, Object map){if (map null) {throw new IllegalArgumentException(map is null.);}this.map map;}这里相对于前面的无参构造函数而言map 对象在外界创建与初始化直接传入 JSONObject 中作为构造函数。这样做使得我们在反序列化、序列化的方法更加灵活这里我们在后面介绍。 containsKey / containsValue / get / isEmpty / size 方法 这几个方法都是直接调用 成员变量 map 得以实现的具体实现代码如下 public int size() {return map.size();}public boolean isEmpty() {return map.isEmpty();}public boolean containsKey(Object key) {boolean result map.containsKey(key);if (!result) {if (key instanceof Number|| key instanceof Character|| key instanceof Boolean|| key instanceof UUID) {result map.containsKey(key.toString());}}return result;}public boolean containsValue(Object value) {return map.containsValue(value);}public Object get(Object key) {Object val map.get(key);if (val null) {if (key instanceof Number|| key instanceof Character|| key instanceof Boolean|| key instanceof UUID) {val map.get(key.toString());}}return val;}public Object getOrDefault(Object key, Object defaultValue) {Object v;return ((v get(key)) ! null) ? v : defaultValue;}反序列化方法 首先出场的是最简单的将 map 中的某个 key 进行反序列化一般情况下我们会在 这个 key 对应的是 Object 的时候使用它。比如原始的map 是 {age: 3, item : {color: black, length : 2}} 我们在反序列化 item 的时候需要调用这个方法即 getJSONObject(item) 。 public JSONObject getJSONObject(String key) {Object value map.get(key);if (value instanceof JSONObject) {return (JSONObject) value;}if (value instanceof Map) {return new JSONObject((Map) value);}if (value instanceof String) {return JSON.parseObject((String) value);}return (JSONObject) toJSON(value);}类似地如果是 JSON 数组的化调用 getJSONArray 方法这里举一个例子为 map 为 {age: 3, items:[{color: red}, {color: black}]}我们在反序列 items 的时候会调用这个方法。 public JSONArray getJSONArray(String key) {Object value map.get(key);if (value instanceof JSONArray) {return (JSONArray) value;}if (value instanceof List) {return new JSONArray((List) value);}if (value instanceof String) {return (JSONArray) JSON.parse((String) value);}return (JSONArray) toJSON(value);}如果不是前面两种我们需要获取的只是简单的 item 对象比如 age 3那么就调用 getObject 方法即可注意这里有几个重载方法。 public T T getObject(String key, ClassT clazz) {Object obj map.get(key);return TypeUtils.castToJavaBean(obj, clazz);}public T T getObject(String key, Type type) {Object obj map.get(key);return TypeUtils.cast(obj, type, ParserConfig.getGlobalInstance());}public T T getObject(String key, TypeReference typeReference) {Object obj map.get(key);if (typeReference null) {return (T) obj;}return TypeUtils.cast(obj, typeReference.getType(), ParserConfig.getGlobalInstance());}这个时候我们不得不介绍一下 TypeUtils 类了毕竟出场率这么高这里只介绍 cast 与 castToJavaBean 两个静态方法。 private static BiFunctionObject, Class, Object castFunction new BiFunctionObject, Class, Object() {public Object apply(Object obj, Class clazz) {if (clazz java.sql.Date.class) {return castToSqlDate(obj);}if (clazz java.sql.Time.class) {return castToSqlTime(obj);}if (clazz java.sql.Timestamp.class) {return castToTimestamp(obj);}return null;}};这里实现了接口 BiFunction 的 apply 方法实现方法也非常简单粗暴三个 if 对应三个方法 castToSql / castToSqlTime / castToTimestamp 。 这个时候可能大家会疑惑这个跟 sql 有什么关系其实确实没什么关系但是毕竟 java 提供的现有的可用方法不用白不用这里也给大家做个广告这里面的 java.sql.Timestamp 与 java.sql.Time 以及 java.sql.Date 确实很好用这里以 java.sql.Timestamp 为例它提供13位时间戳的构造方法 public Timestamp(long time) 以及常用的 compareTo 、before 、after 方法需要的小伙伴可以自取使用。 而 cast 方法 居然都有 SuppressWarnings(unchecked) 标注着实让人多少有点不放心难道一定要去使用 Fastjson2 这里我们查看其中一个方法的实现看完了你大概就会产生一种 “就这我上我也行” 的感觉 SuppressWarnings(unchecked)public static T T cast(Object obj, Type type, ParserConfig mapping) {if (obj null) {return null;}if (type instanceof Class) {return cast(obj, (ClassT) type, mapping);}if (type instanceof ParameterizedType) {return (T) cast(obj, (ParameterizedType) type, mapping);}if (obj instanceof String) {String strVal (String) obj;if (strVal.length() 0 //|| null.equals(strVal) //|| NULL.equals(strVal)) {return null;}}if (type instanceof TypeVariable) {return (T) obj;}throw new JSONException(can not cast to : type);}事实也确实如此充其量就是用了点反射技术首先判断数据类型属于哪个小可爱的子类然后再使用放射和传过来的 clazz 创建对象而建立其中的映射关系的就是其中的 mapping 参数对象仅此而已。 JSON 与 JSONObject 的区别与联系 能够用 JSON 的地方基本上都能用 JSONObject不同之处在于一般直接 JSON 的静态方法因为它是抽象类不能直接 new 出对象的。而 JSONObject 名字中就强调了 Object 的概念所以一般直接就用它的对象的方法。 灵活使用 JSONObject 总体来说最经常用到的就是 toString 与 toJSONObject 以及 JSONObject 对象的 getInteger / getLong / getJSONObject 等等方法这些方法都应该基于 map 联想记忆都是比较容易理解的。 总结 Fastjson 中存在很多地方都属于让人看了就 “恍然大悟” 之处也推荐大家去阅读同时不得不说阿里巴巴能够有支团队开发并不断完善Fastjson也是挺值得前去 github 点颗星星。 最后吐槽一下 Fastjson 的实现部分有明显的 “不遵守 《JAVA 规范手册》” 的请以后的开发人员注意多多参考 Java开发手册嵩山版 多写一些些注释成为一本与 手册 配套的代码示例也是非常不错的 ~ 此致敬上 ~ Smileyan 2023.04.13 00:44
http://www.hkea.cn/news/14277607/

相关文章:

  • 洞泾做网站公司网站pv是什么
  • 360免费建站 服务期班级网页模板
  • 哪里有门户网站开发.net 开源 企业网站
  • 江苏住房和城乡建设网站做网站用哪个开发工具好
  • 简述企业网站如何推广wordpress采集功能
  • 网站icp没有备案怎么检查六安人论坛最新招聘
  • 网上服务旗舰店东昌府聊城网站优化
  • 网站建设的基本内容外贸模版网站
  • icp备案后要建网站吗正规网站有哪些
  • 自适应型网站建设服务电话折腾wordpress
  • WordPress网站接入公众号杭州优化公司哪家好
  • 网站开发用户需求说明书定西网站建设公司排名照片
  • 基于jsp的网站开发的文献做网站的学什么代码
  • 佛山做网站3000开o2o网站需要什么手续
  • 福田网站建设费用网站建设 用什么语言
  • 提交网站入口企业网上申报入口
  • 中小型企业建设网站网站用户体验解决方案
  • 宁波北仑做网站酒店网站免费建设
  • 黑龙江期刊网站制作seo 专业为网站建设
  • 甜品网站模板如何做一起好的视频宣传自己的网站
  • 网站开发的功能需求和模块划分html简单一套网页源代码
  • 网站建设个人年终总结手工制作花朵
  • 抚顺您做煮火锅网站深圳企业名录深圳黄页
  • 做外贸的都有那些网站软件开发 东莞
  • 黑龙江省建设安全监督网站网页设计师 培训
  • 网站备案查询 站长的怎么实现vs2010网站开发教程
  • 购物网站 后台模板网站返回指定位置怎么做
  • 海南住房建设厅定额网站深圳有几个区分别叫什么
  • 网站开发用例说明建立网站就是制作网页
  • 住房和城乡建设部主网站北京app开发定制公司