LitJson使用时遇到的问题 Dictionary修复

LitJSON 简介

一个. net库,用于处理JSON (JavaScript对象表示法)字符串之间的转换。
传送门: LitJSON Github仓库

测试使用

  • 下载LitJSON 源码,
  • 新建测试工程,将Litjson中的src\LitJson文件夹拷贝到测试工程。
  • 新建测试代码
using System;
using System.Collections.Generic;

namespace LitJsonTest
{
    public enum MyEnum
    {
        AAA,
        BBB,
        CCC,
    }
    public class TestClassA
    {
        public byte a;
        public int b;
        public float c;
        public double d;
        public short e;
        public string h;

        public void Init()
        {
            a = 1;
            b = 200;
            c = 1.2f;
            d = 3.14d;
            e = 300;
            h = "测试测试";
        }
    }
    public class TestClassB
    {
        public TestClassA a;
        public MyEnum b;
        public void Init()
        {
            a = new TestClassA();
            a.Init();
            b = MyEnum.BBB;
        }
    }


    class Program
    {
       
        static void Main(string[] args)
        {
            var testa = new TestClassA();
            testa.Init();
            var jsonStr = LitJson.JsonMapper.ToJson(testa);
            Console.WriteLine(jsonStr);
            var testb = LitJson.JsonMapper.ToObject<TestClassA>(jsonStr);
            Console.WriteLine("-------装换成功!");
            
            var testba = new TestClassB();
            testba.Init();
            jsonStr = LitJson.JsonMapper.ToJson(testba);
            Console.WriteLine(jsonStr);
            var testbb = LitJson.JsonMapper.ToObject<TestClassB>(jsonStr);
            Console.WriteLine("-------装换成功!");

            var testList = new List<TestClassA>() { testa};
            jsonStr = LitJson.JsonMapper.ToJson(testList);
            Console.WriteLine(jsonStr);
            var testListb = LitJson.JsonMapper.ToObject<List<TestClassA>>(jsonStr);
            Console.WriteLine("-------装换成功!");

            var testDic= new Dictionary<int,TestClassA>();
            testDic.Add(1, testa);
            jsonStr = LitJson.JsonMapper.ToJson(testDic);
            Console.WriteLine(jsonStr);
            var testDicb = LitJson.JsonMapper.ToObject<Dictionary<int, TestClassA>>(jsonStr);
            Console.WriteLine("-------装换成功!");

            var testDicc = new Dictionary<MyEnum, TestClassA>();
            testDicc.Add(MyEnum.BBB, testa);
            jsonStr = LitJson.JsonMapper.ToJson(testDicc);
            Console.WriteLine(jsonStr);
            var testDicbb = LitJson.JsonMapper.ToObject<Dictionary<MyEnum, TestClassA>>(jsonStr);
            Console.WriteLine("-------装换成功!");

            Console.Read();
        }
    }
}

输出结果

{"a":255,"b":2147483647,"c":3.4028235E+38,"d":1.7976931348623157E+308,"e":32767,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"}
-------转换成功!
{"a":null,"b":0}
-------转换成功!
[{"a":255,"b":2147483647,"c":3.4028235E+38,"d":1.7976931348623157E+308,"e":32767,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"}]
-------转换成功!
{"1":{"a":255,"b":2147483647,"c":3.4028235E+38,"d":1.7976931348623157E+308,"e":32767,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"}}

此时 jsonStr 转换 Dictionary 报错,可以看出这里是由string类型转int类型的key出错。

System.ArgumentException:“The value “1” is not of type “System.Int32” and cannot be used in this generic collection. ”

修复

根据错误堆栈可以找到错误部分代码为jsonMapper.cs 中的 ReadValue(),

((IDictionary) instance).Add (property, ReadValue (t_data.ElementType, reader));

修改为:

var dic = ((IDictionary)instance);
object key = property;
var dictypes = instance.GetType().GetGenericArguments();
var converter = System.ComponentModel.TypeDescriptor.GetConverter(dictypes[0]);
if (converter != null)
{
    key = converter.ConvertFromString(property);
    t_data.ElementType = dictypes[1];
}
var value = ReadValue(t_data.ElementType, reader);
dic.Add(key,value);

这里同时修改了int类型做key的错误,以及enum类型做key的错误,自定义类型解析错误。

再次运行测试,输出正常

{"a":1,"b":200,"c":1.2,"d":3.14,"e":300,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"}
-------装换成功!
{"a":{"a":1,"b":200,"c":1.2,"d":3.14,"e":300,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"},"b":1}
-------装换成功!
[{"a":1,"b":200,"c":1.2,"d":3.14,"e":300,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"}]
-------装换成功!
{"1":{"a":1,"b":200,"c":1.2,"d":3.14,"e":300,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"}}
-------装换成功!
{"BBB":{"a":1,"b":200,"c":1.2,"d":3.14,"e":300,"h":"\u6D4B\u8BD5\u6D4B\u8BD5"}}
-------装换成功!

参考:LitJson报错记录

猜你喜欢

转载自blog.csdn.net/sunheng_/article/details/128678662