我在C#中有一个名为MyObject的对象,我一直在努力创建它,以便我们可以获取此对象,将其序列化为JSON,使用该JSON在JavaScript中填充其他列表等,然后使用结果将JSON字符串更改为反馈到MyObject对象并更改其值。但是,每当我在这个对象上调用Json()时,它就会给我正确的序列化JSON,但是当我将那个确切的JSON反馈回UpdateFromJson(字符串json)方法时,它声称List的count = 0并且我没有我在新对象中的List对象。其他属性填充得很好;唯一的问题是List。
这是没有属性但具有相关方法和对象列表的(dumbed down)类。应该注意的是List包含我在命名空间中其他地方定义的对象,即它们不在任何地方的C#框架中,它们是自定义的。
[Serializable]
public class MyObject
{
public MyObject()
{
this.Elements = new List<MyObjectElement>();
}
public List<MyObjectElement> Elements { get; private set; }
public string Json()
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(this);
}
public void UpdateFromJson(string json)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new JavaScriptSerializer();
MyObject temp = serializer.Deserialize<MyObject>(json);
foreach (PropertyInfo property in temp.GetType().GetProperties())
{
object value = property.GetValue(temp, null);
if (value != null)
{
if (value.GetType() == typeof (List<MyObjectElement>))
{
foreach(MyObjectElement le in (List<MyObjectElement>)value)
{
this.Elements.Add(le);
}
}
}
property.SetValue(this, value, null);
}
}
}
就像我说的,我遇到的唯一问题是,例如当serializer.Deserialize<MyObject>(json)
发生时,List实际上没有任何东西,实际上是实际的JSON字符串(我把它打印到了浏览器并在JSONLint中测试过它包含Elements的数据。似乎Deserialize(json)
无法以其可以解析的格式检索List,或者我不确定。
答案 0 :(得分:2)
正如拉尔夫建议的那样,我的内部列表的设置者是私有的。我改变了它,它引发了一堆重构。最终发生的是我为每个扩展MyObjectElement的Type选择了显式列表,这样在序列化为JSON时它可以反序列化而不会损失精度。
答案 1 :(得分:1)
我猜想typeof(List<MyObjectElement>)
的等式检查失败了。可能正在反序列化的类型是数组或IList或其他类型。你能不能只使用反序列化的对象代替这个对象并将其映射到对象之外?为什么要将它映射到自身内?