前言:java
最近項目在某XX領導的所謂指引下,非要轉型Java,轉就轉吧,在轉的過程前期是個痛苦期,特別.NET舊有項目和Java新項目須要通訊時。spring
進入主題,Java和.NET之間須要通訊,這時媒介不少,協議不少。其中json應該是比較經常使用的。而json一開始看過去,以爲這個問題實在簡單要弱智,沒什麼好深究的。可是你實際作的過程當中卻不是這樣。json
好比Java序列化/反序列化時區默認不是取服務器上的時區,好比.NET默認序列化DateTime格式是微軟自家定義的,到了Java那邊天然轉不了,報錯。服務器
廢話到此爲止,先出點會報錯的代碼看看:app
ObjectMapper mapper = new ObjectMapper(); JavaType javaType = mapper.getTypeFactory().constructParametricType(ArrayList.class, Message.class); List<Message> olds = mapper.readValue(sv,javaType);
通常而言,轉換一個列表Java使用spring集成的jackson語法如上,若是是Java本身序列化的數據呢,是反序列化回來是問題的,可是.NET那邊序列化的數據呢?很差意思,時間格式轉換失敗,很差意思,bool類型轉換失敗。好比如下錯誤信息:ide
com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.util.Date from String value 'spa
.NET那邊若是是Java序列化的數據呢?日常我通常都是用Newtonsoft序列化進去,也不用管太多其餘。確實,不考慮Java方面,確實兩個語言上json沒什麼好糾結的。可是若是如今仍是和之前同樣過來的數據,.NET bool類型會轉換true/false,這時候Java是不能識別的。咱們須要加一個轉換器,下面看看怎麼搞才能全局上支持:.net
public class BoolConverter : JsonConverter { public override bool CanConvert(Type objectType) { return true; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { try { if (reader.TokenType == JsonToken.Integer) { //數值 return Convert.ToInt32(reader.Value) == 1; } } catch (Exception ex) { throw new Exception(string.Format("Error converting value {0} to type '{1}'", reader.Value, objectType)); } throw new Exception(string.Format("Unexpected token {0} when parsing enum", reader.TokenType)); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } //bool.TryParse() bool bValue = (bool)value; if (bValue) writer.WriteValue(1); else writer.WriteValue(0); } }
加了轉換器,這時候確實能夠解決bool類型轉換時多語言問題,通用的通常都是0,1。code
再看看時間格式方面,你也須要作些時區以及格式上的設置:orm
.net:
var serializerSettings = new JsonSerializerSettings(); serializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat; serializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; return JsonConvert.SerializeObject(o, serializerSettings);
java:
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); df.setTimeZone(TimeZone.getTimeZone("GMT+8")); mapper.getDeserializationConfig().with(df); mapper.setDateFormat(df);
好了。
一、如今都在北京時間頻道下,如今都是iso標準格式。
二、bool類型所有用0,1
其餘廢話,
一、spring附帶了jackson,因此沒考慮用其餘json,爲了統一。
二、這類格式和類型問題能夠作一個通用的攔截器,全局幫大夥作了。好了,去作全局轉換攔截器了。