LitJson库中JsonMapper.ToJson中如果存在JsonData结构导致解析失败

发生异常的代码:

public class ArenaBask
{
    public int Id;
    public string value;
    public JsonData Dic;
}


public class EncodeDemo
{
    public void Run()
    {
        string jsonStr = "{'Id':5658, 'value':'CCCC', 'Dic':{'a':123, 'b':'cdc'}}";
        JsonReader reader = new JsonReader(jsonStr);
        ArenaBask bask = JsonMapper.ToObject(reader);
        Console.WriteLine(JsonMapper.ToJson(bask));
    }
}

当JsonMapper.ToJson时发生错误.

原因: 

JsonMapper中使用JsonWriter来序列化对象,本来每个key对应一个value,在读到key的时候writer中的context会将ExpectingValue字段置为true,表明接下来应当写入一个值,但是JsonMapper中的WriteValue函数中,将IJsonWrapper接口对象给特殊处理了,走另外一个方式了:

            if (obj is IJsonWrapper)
            {
                if (writer_is_private)
                    writer.TextWriter.Write(((IJsonWrapper)obj).ToJson());
                else
                    ((IJsonWrapper)obj).ToJson(writer);
                return;
            }
导致writer.context.ExpectingValue没有及时置回false,导致异常报错.


解决方案:

去掉关于writer_is_private的判断,看了代码觉得这好像没什么用,修改为以下这个样子:
            if (obj is IJsonWrapper)
            {
                ((IJsonWrapper)obj).ToJson(writer);
                return;
            }

该github分支是个人及项目中使用的一些功能升级及一些bug的维护.
https://github.com/JunC74/litjson

你可能感兴趣的:(LitJson库中JsonMapper.ToJson中如果存在JsonData结构导致解析失败)