返回

问题1:时间格式转换异常

前端

LitJson是.NET平台上一个轻量级的Json解析器。使用LitJson时,有一些常见的问题,需要特别注意。


LitJson默认使用"yyyy-MM-ddTHH:mm:ss"格式解析时间。

如果Json中的时间格式不符合此格式,就会抛出异常。

解决方法:

可以使用LitJson提供的JsonMapper.RegisterFormatter方法,注册自定义时间格式化器。

//注册自定义时间格式化器
JsonMapper.RegisterFormatter<DateTime>(new IsoDateTimeConverter());

然后就可以使用自定义的时间格式化器来解析Json中的时间了。

var json = "{\"date\":\"2020-01-01T08:00:00\"}";
var data = JsonMapper.ToObject<Dictionary<string, object>>(json);

//解析时间
var date = (DateTime)data["date"];

LitJson默认情况下,会将Json中的空值解析为null

但是在某些情况下,我们可能希望将Json中的空值解析为默认值。

解决方法:

可以使用LitJson提供的JsonMapper.RegisterImporter方法,注册自定义空值处理程序。

//注册自定义空值处理程序
JsonMapper.RegisterImporter<object>(new NullValueImporter());
//自定义空值处理程序
public class NullValueImporter : IValueImporter
{
    public object Import(object input)
    {
        if (input == null)
        {
            return 0;  //返回默认值
        }
        return input;
    }
}

然后就可以使用自定义的空值处理程序来解析Json中的空值了。

var json = "{\"name\":null,\"age\":20}";
var data = JsonMapper.ToObject<Dictionary<string, object>>(json);

//解析空值
var name = (string)data["name"]; //name为null
var age = (int)data["age"]; //age为20

Json数据中包含循环引用时,LitJson可能会出现栈溢出异常。

这是因为LitJson默认情况下,不支持循环引用的解析。

解决方法:

可以使用LitJson提供的JsonMapper.RegisterImporter方法,注册自定义循环引用处理程序。

//注册自定义循环引用处理程序
JsonMapper.RegisterImporter<object>(new CircularReferenceImporter());
//自定义循环引用处理程序
public class CircularReferenceImporter : IValueImporter
{
    private Dictionary<object, object> _visitedObjects;

    public CircularReferenceImporter()
    {
        _visitedObjects = new Dictionary<object, object>();
    }

    public object Import(object input)
    {
        if (_visitedObjects.ContainsKey(input))
        {
            return _visitedObjects[input];
        }
        else
        {
            _visitedObjects.Add(input, input);
            return input;
        }
    }
}

然后就可以使用自定义的循环引用处理程序来解析Json中的循环引用了。

var json = "{\"name\":\"John\",\"children\":[{\"name\":\"Mary\",\"parent\":{\"name\":\"John\"}}]}";
var data = JsonMapper.ToObject<Dictionary<string, object>>(json);

//解析循环引用
var name = (string)data["name"]; //name为"John"
var children = (List<object>)data["children"]; //children为[{name:"Mary",parent:{name:"John"}}]
var parent = (Dictionary<string, object>)children[0]["parent"]; //parent为{name:"John"}