C# Json:使用泛型字段反序列化对象时出错

C# Json:使用泛型字段反序列化对象时出错,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我有一个问题:Json.NET是否正确地处理泛型?我有下一个代码: [TestClass] public class TestClass1_Test { [TestMethod] public void ToJson() { var mot = new TestClass1(1, "title"); var result = mot.ToJson(); Assert.IsNotNull(result); v

我有一个问题: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; }
}
[TestClass]
公共类测试Class1\u测试
{
[测试方法]
public-void-ToJson()
{
var mot=新测试类别1(1,“标题”);
var result=mot.ToJson();
Assert.IsNotNull(结果);
var pobject=TestClass1.FromJson(结果);
Assert.AreEqual(pobject.Id,mot.Id);
}
}
公共类TestClass1
{
公共TestClass1(int-id,字符串名)
{
Id=新字段(Id);
名称=新字段(名称);
}
公共字段Id{get;set;}
公共字段名{get;set;}
公共字符串ToJson()
{
var jobject=jobject.FromObject(this);
返回jobject.ToString();
}
公共静态TestClass1 FromJson(字符串json)
{
var obj=JObject.Parse(json.ToObject();
返回obj;
}
}
公共类字段
{
公共字段(T val)
{
值=默认值(T);
}
公共T值{get;set;}
}
但是当我调用
var obj=JObject.Parse(json).ToObject()时,我得到了下一个错误:

Newtonsoft.Json.JsonReaderException:读取整数时出错。想不到的 标记:StartObject。路径“Id”,第2行,位置10


我的错在哪里?或者Json.NET不适用于泛型?

Json.NET确实适用于泛型-我能够很好地序列化和反序列化一个
字段
对象

我从上述代码(使用Json.NET 4.5 r10)中得到的错误消息是:

堆栈跟踪暗示它在遇到
{
时试图反序列化一个整数,这是
Id
对象的开始。我认为这很可能是一个bug

然而,在使用Json.NET 3.5 r8时,这似乎和预期的一样有效。我确实必须将
JsonConvert.DeserializeObject(Json)
交换为
JObject.Parse(Json).ToObject()
,因为后者不在本版本中

因此,答案是尝试不同版本的Json.NET

字段
构造函数中还有一个bug

Value = default(T);
应该是:

Value = val;

仅供参考;如果将包含嵌套JSON对象的对象反序列化为字符串,也可能发生此错误


如果您忘记对其进行字符串化,解析器会抛出此错误。

出于兴趣,为什么不在类public int Id{get;set;}上设置类型呢?Field的用法是什么?我假设它是因为Field!=Int,即Newtonsoft不知道Field是什么。也许你可以为Field编写自定义转换器?@Mike,这只是个例子。我不想用generic取消Json.NET的工作。在真实的live Field中更困难。
Value = val;