先上张图,代表我心中的十万头草泥马:
写这么长的代码,头回见数组和单个实体共用同一个 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 序列化都有这样的问题。