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

Java 的世界,我不懂:奇葩的 json 序列化-LMLPHP

写这么长的代码,头回见数组和单个实体共用同一个 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 序列化都有这样的问题。

05-07 15:55