0

我在 C# 中有一个名为 MyObject 的对象,我一直在尝试制作它,以便我们可以获取该对象,将其序列化为 JSON,使用该 JSON 填充 JavaScript 中的其他列表等,然后使用生成的更改后的 JSON 字符串反馈到 MyObject 对象并更改其值。但是,每当我在此对象上调用 Json() 时,它都会为我提供正确序列化的 JSON,但是当我将确切的 JSON 反馈回 UpdateFromJson(string json) 方法时,它声称 List 的 count=0 并且我没有新对象中的我的列表对象。其他属性填充得很好;唯一的问题是列表。

这是没有属性但具有相关方法和对象列表的(简化的)类。应该注意的是,列表包含我在命名空间中其他地方定义的对象,即它们不在 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)发生时,列表中没有任何内容,而实际上,实际的 JSON 字符串(我已经将它打印到浏览器并在 JSONLint 中对其进行了测试)包含元素的数据。似乎Deserialize(json)无法以它可以解析的格式检索列表,或者我不确定。

4

2 回答 2

2

正如 Ralf 所建议的,我将内部 List 的 setter 设为私有。我改变了它,它引发了一堆重构。最终发生的事情是,我选择为扩展 MyObjectElement 的每个类型设置显式列表,以便在序列化为 JSON 时可以反序列化而不会损失精度。

于 2013-06-07T13:25:27.920 回答
1

我猜想相等性检查typeof(List<MyObjectElement>)失败。可能被反序列化的类型是数组或 IList 或其他。你不能只使用反序列化的对象代替这个对象并将它映射到对象之外吗?为什么要在其内部映射它?

于 2013-06-06T17:39:05.210 回答