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报错记录