先上张图,代表我心中的十万头草泥马:

写这么长的代码,头回见数组和单个实体共用同一个 json 节点的! 恐怕只有 java 社区的大牛B 才能做出这等事。。

由 Apache 发布: http://cxf.apache.org/docs/jax-rs-data-bindings.html
处理 JSON 数组序列化问题
JSON 社区存在一个众所周知的问题,即对仅包含一个值的列表对象进行序列化会出错。要解决此问题,需要在 JSON 提供程序上启用“serializeAsArray”功能,并通过其他选项指定需要使用“arrayKeys”属性进行相应处理的各个字段。
请注意,“serializeAsArray”和“arrayKeys”可结合生成所谓的自然惯例序列。

这个“众所周知”,我这些年居然一无所知啊!书白读了。。。

用 Json.Net 解析这样的数据好像没有原生的支持,这个什么 serializeAsArray / arrayKeys 根本就搜到有用的东西出来!

还好我不傻,搞了个解决方法出来:

     public class ElementToArrayConverter : JsonConverter
     {
         public override bool CanConvert(Type objectType)
         {
             return true;
         }

         public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
         {
             if (reader.TokenType == JsonToken.Null)
                 return null;

             var token = JObject.ReadFrom(reader);

             if (token.Type == JTokenType.Array)
             {
                 //
             }
             else
             {
                 #region 用于逗逼的 EAN Api,不同的参数,单个的直就是一个实例,多个的返回成数组!导致类型转换失败!!!
                 if (objectType.GetInterface("IEnumerable") != null)
                 {
                     var json = string.Format("[{0}]", token);
                     token = JToken.Parse(json);
                 }
                 #endregion
             }

             return serializer.Deserialize(token.CreateReader(), objectType);
         }

         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
         {
             throw new NotImplementedException();
         }
     }

然后加标注:

         [JsonConverter(typeof(ElementToArrayConverter))]
         [JsonProperty("HotelRoomResponse")]
         public IEnumerable<RoomInfo> Room
         {
             get;
             set;
         }

Java我不懂,读书少,不知道是不是所有的 json 序列化都有这样的问题。

Java 的世界,我不懂:奇葩的 json 序列化的更多相关文章

  1. JAVA 根据数据库表内容生产树结构JSON数据

    1.利用场景 组织机构树,通常会有组织机构表,其中有code(代码),pcode(上级代码),name(组织名称)等字段 2.构造数据(以下数据并不是组织机构数据,而纯属本人胡编乱造的数据) List ...

  2. 新霸哥带你进入java的世界

    新霸哥从近期大家的留言中注意到了大家对基础知识比较重视,很多的朋友希望多讲一些入门的知识,为了满足广大开发爱好者的需求,新霸哥决定从最基础的做起,一点一点的帮助大家一起走进云计算的世界.下面新霸哥首先 ...

  3. Java JSON序列化杂谈

    在C#中序列化是比较容易的,如果不用第三方的类库,那么C#提供的两个对象也够我们使用,一般的操作是定义一个不含有方法的类,这个类里面定义了要序列化的对象的属性,因为我C#用的比较多,这里直接给出泛型, ...

  4. JAVA与C#关于JSON序列化的比较

    JAVA CODE: import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java. ...

  5. Java中的Json序列化,不容忽视的getter

    在开发的过程中,经常会碰到和自己预期不一样的情况.有的时候自己去研究一下还是很有趣的.这两天在写java web的时候,碰到了一个对象序列化的问题. 问题重现 public class AjaxJso ...

  6. Atitit 纯java项目的提升进度大法---通用json dsl接口

    Atitit 纯java项目的提升进度大法---通用json dsl接口 1. Json dsl接口1 1.1. Url:  http://aaa.com/api_jsondsl?dsl={}1 1. ...

  7. Java 和 Python 解析动态 key 的 JSON 数据

    一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...

  8. 转换成json字符串,与json字符串转换成java类型都要先转换成json对象

    转换成json字符串,与json字符串转换成java类型都要先转换成json对象

  9. Java 字符串(String)格式转json格式

    json是前后端传输数据的一种文本格式,json其实就是字符串,因为前后端传输数据时,只能传输字符串,我们又想传一些对象或者列表信息,这都是很常见的应用场景. 所以,我们需要在java代码中,把jav ...

随机推荐

  1. pycharm active code

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  2. 模块module

    python中的Module相当于C++中头文件和命名空间的组合体,便于代码的组织,任何一个python代码的文件都是一个Module,都可以被其他模块import import,from...imp ...

  3. tar, rar, unrar, zip, unzip

    tar 打包/解包/压缩/解压缩文件,注意打包和压缩不是一回事,打包相当于捆绑,压缩是在捆绑好后再把里面的空隙挤出以生成更小的文件 $tar [-zjxcvf] filename.tar[.gz... ...

  4. android Eclipse执行项目提示错误: unable to execute dex: GC orerhead limit exceeded

    Eclipse执行项目提示错误: unable to execute dex: GC orerhead limit exceeded 解决方法: 找到Eclipse安装目录的文件,\eclipse\e ...

  5. js中的继承

    js中继承的实现方式很多,此处给出两种常用方式. <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> ...

  6. Javascript进度条

    一个简单的进度条演示. <!doctype html> <html> <head> <meta charset="utf8"> &l ...

  7. [转]OnKeyDown Numeric Validator CLIENT SIDE

    本文转自:http://forums.asp.net/t/1211724.aspx?OnKeyDown+Numeric+Validator+CLIENT+SIDE <!DOCTYPE html ...

  8. 在Windows Azure虚拟机上开发Windows 8 应用

    前提条件 Windows Azure开发者账号:如果您拥有微软MSDN Subscription账户,那么意味着您可免费申请Windows Azure开发者账号. 创建虚拟机 点击Windows Az ...

  9. struts2初体验

    一:什么是struts2? Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点 Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开 ...

  10. java 23 - 3 单例模式实现Runtime类

    Runtime:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接. 其中一个方法: exec(String command) 在单独的进程中执行指定的字符串 ...