前言
前几天因为项目需求,需要使用Json来做某个功能的数据的序列化,但不能引入新的第三方库,所以只能使用项目里已有的LitJson库
然而后面要用到int类型作为字典Key,但是LitJson又不支持这种做法,所以只能自己想办法对其源码进行修改
源码修改
要做到支持字典key为int类型,只需要对JsonMapper.cs文件进行修改即可
总共需要修改3个方法
在AddObjectMetadata方法中,修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| foreach (PropertyInfo p_info in type.GetProperties()) { if (p_info.Name == "Item") {
if (parameters[0].ParameterType == typeof(string) || parameters[0].ParameterType == typeof(int)) data.ElementType = p_info.PropertyType;
continue; }
}
|
增加对Object的Metadata的int类型key的识别判断
ReadValue
在ReadValue方法中,修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| else if (reader.Token == JsonToken.ObjectStart) { AddObjectMetadata(value_type); ObjectMetadata t_data = object_metadata[value_type];
instance = Activator.CreateInstance(value_type);
bool isIntKey = t_data.IsDictionary && value_type.GetGenericArguments()[0] == typeof(int);
while (true) {
if (t_data.Properties.ContainsKey(property)) {
} else {
if (isIntKey) { ((IDictionary)instance).Add(Convert.ToInt32(property), ReadValue(t_data.ElementType, reader)); } else { ((IDictionary)instance).Add(property, ReadValue(t_data.ElementType, reader)); }
}
}
}
|
增加在读取json文本时对字典int类型key的检查
WriteValue
在WriteValue方法中,修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| if (obj is IDictionary) { writer.WriteObjectStart(); foreach (DictionaryEntry entry in (IDictionary)obj) {
if (entry.Key is string key) { writer.WritePropertyName(key); WriteValue(entry.Value, writer, writer_is_private, depth + 1); } else { writer.WritePropertyName(entry.Key.ToString()); WriteValue(entry.Value, writer, writer_is_private, depth + 1); } } writer.WriteObjectEnd();
return; }
|
增加在写入时对非string类型的key的支持