我有一个问题:Json.NET 正确处理泛型吗?我有下一个代码:
[TestClass]
public class TestClass1_Test
{
[TestMethod]
public void ToJson()
{
var mot = new TestClass1(1, "title");
var result = mot.ToJson();
Assert.IsNotNull(result);
var pobject = TestClass1.FromJson(result);
Assert.AreEqual(pobject.Id, mot.Id);
}
}
public class TestClass1
{
public TestClass1(int id, string name)
{
Id = new Field<int>(id);
Name = new Field<string>(name);
}
public Field<int> Id { get; set; }
public Field<string> Name { get; set; }
public string ToJson()
{
var jobject = JObject.FromObject(this);
return jobject.ToString();
}
public static TestClass1 FromJson(string json)
{
var obj = JObject.Parse(json).ToObject<TestClass1>();
return obj;
}
}
public class Field<T>
{
public Field(T val)
{
Value = default(T);
}
public T Value { get; set; }
}
但是当我打电话给var obj = JObject.Parse(json).ToObject<TestClass1>()
时,我收到下一个错误:
Newtonsoft.Json.JsonReaderException:读取整数时出错。意外 令牌:启动对象。路径"Id",第 2 行,位置 10。
我的错误在哪里?或者 Json.NET 不适用于泛型?
Json.NET 确实适用于泛型 - 我能够很好地序列化和反序列化您的一个Field<int>
对象。
我通过上述代码(使用 4.5 r10 Json.NET)收到的错误消息是:
Error reading integer. Unexpected token: StartObject. Path 'Id', line 2, position 10
堆栈跟踪暗示它试图反序列化一个整数,当它遇到一个{
,这是Id
对象的开始。我认为这很可能是一个错误。
然而,在使用 Json.NET 3.5 r8 时,这似乎按预期工作。我确实不得不JsonConvert.DeserializeObject<TestClass1>(json)
换成JObject.Parse(json).ToObject<TestClass1>()
因为后者不在此版本中。
因此,答案是尝试不同版本的 Json.NET。
Field
构造函数中也存在一个错误。
Value = default(T);
应该是:
Value = val;
供参考;如果要反序列化包含嵌套 JSON 对象作为字符串的对象,也会出现此错误。
如果您忘记将其字符串化,解析器将引发此错误。