c# - 牛顿软件.Json : error on deserialize objects with generic fields

标签 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: Error reading integer. Unexpected token: StartObject. Path 'Id', line 2, position 10.

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

最佳答案

Json.NET 确实可以使用泛型 - 我能够序列化和反序列化您的 Field<int> 之一对象就好了。

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

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;

关于c# - 牛顿软件.Json : error on deserialize objects with generic fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13612733/

相关文章:

javascript - 为什么 jQuery.parseJSON 在 Firefox 中无法解析这个有效的 JSON 文档?

php - 序列化 PHP 反射

java - 从未调用过序列化方法

c# - DataContract 向后兼容序列化

c# - C#获取结构的大小

c# - 字符串到 Lucene 查询

c# - 为什么 Entity Framework 6.x 不缓存结果?

php - 如何制作脚本以从JSON API捕获某些数据?

c# - 你怎么能加两个分数?

json - 在 Swift 中从 Firebase 读取数据