【发布时间】:2015-01-12 09:32:45
【问题描述】:
使用 Json.net,反序列化包含 Tuple<...> 的类型不起作用(序列化有效,但反序列化无效):
[TestMethod]
public void Test()
{
var orig = new TupleHolder("what????", true);
var json = JsonConvert.SerializeObject(orig);
Assert.AreEqual("{\"Tup\":{\"Item1\":\"what????\",\"Item2\":true}}", json);
// great! serialization works like a charm! now let's test deserialization:
var dupl = JsonConvert.DeserializeObject<TupleHolder>(json);
Assert.AreEqual("ZZZ", dupl.Tup.Item1); // pass! but it should be "what????"... what????
Assert.AreEqual(false, dupl.Tup.Item2); // pass! but it should be "true", right???
Assert.AreEqual(orig.Tup.Item1, dupl.Tup.Item1); // fail!
Assert.AreEqual(orig.Tup.Item2, dupl.Tup.Item2); // fail!
}
public class TupleHolder
{
public Tuple<string, bool> Tup { get; set; }
public TupleHolder() { Tup = new Tuple<string, bool>("ZZZ", false); }
public TupleHolder(string s, bool b) { Tup = new Tuple<string, bool>(s, b); }
}
有趣的是,Tuple<...> 的直接反序列化确实有效:
[TestMethod]
public void Test2()
{
var orig = new Tuple<string, bool>("ABC", true);
var json = JsonConvert.SerializeObject(orig);
var dupl = JsonConvert.DeserializeObject<Tuple<string, bool>>(json);
Assert.AreEqual(orig, dupl); // direct deserialization of Tuple<...> works.
}
这是一个 Json.NET 错误还是我在这里遗漏了什么?
【问题讨论】:
-
我认为这与您的问题相似...stackoverflow.com/questions/23017716/…。这是由于使用了无参数构造函数
-
@JoelGregory,有点……问题是,如果我有一个
List<T>,它将被正确反序列化,只是Tuple<...>是有问题的。我想Json.NET检查属性/字段是否实现IEnumerable/ICollection/IList/... 而Tuple<...>没有... -
@JoelGregory,一种解决方法可能是使用
[JsonObject(MemberSerialization.Fields)],但它会在JSON字符串中创建一个丑陋的<Tup>k__BackingField字符串......我希望有一个这样的简单解决方案,没有这个额外的字符串...
标签: c# serialization json.net deserialization json-deserialization