Newtonsoft.Json:使用通用字段反序列化对象时出错

时间:2012-11-28 19:18:21

标签: 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);

        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:读取整数时出错。意外   token:StartObject。路径'Id',第2行,第10位。

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

2 个答案:

答案 0 :(得分:2)

Json.NET确实适用于泛型 - 我能够很好地序列化和反序列化你的Field<int>个对象。

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

Error reading integer. Unexpected token: StartObject. Path 'Id', line 2, position 10

堆栈跟踪暗示它试图在整数遇到{时尝试反序列化,IdJsonConvert.DeserializeObject<TestClass1>(json)对象的开头。我认为这很可能是一个错误。

然而,当使用Json.NET 3.5 r8时,这似乎按预期工作。我必须将JObject.Parse(json).ToObject<TestClass1>()替换为Field,因为后者不在此版本中。

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

Value = default(T); 构造函数中还存在一个错误。

Value = val;

应该是:

{{1}}

答案 1 :(得分:1)

供参考;如果要将包含嵌套JSON对象的对象反序列化为字符串,也会出现此错误。

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