0

私は C# で MyObject と呼ばれるこのオブジェクトを作成しようとしています。このオブジェクトを取得して JSON にシリアル化し、その JSON を使用して JavaScript の他のリストにデータを入力し、結果として変更された JSON 文字列を使用できるようにしようとしています。 MyObject オブジェクトにフィードバックされ、その値が変更されます。ただし、このオブジェクトで Json() を呼び出すたびに、正しくシリアル化された JSON が返されますが、その正確な JSON を UpdateFromJson(string json) メソッドに戻すと、List が count=0 であると主張され、何も取得されません。新しいオブジェクトのリスト オブジェクトの。他のプロパティは問題なく入力されます。唯一の問題はリストにあります。

これは、プロパティのない (簡略化された) クラスですが、関連するメソッドとオブジェクトのリストがあります。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)、実際には実際のJSON文字列がリストに何も含まれていない場合です(ブラウザに出力してJSONLintでテストしました)要素のデータが含まれています。解析できる形式でリストを取得できないか、何かわかりDeserialize(json)ません。

4

2 に答える 2

2

Ralf が提案したように、内部 List のセッターを非公開にしました。私はそれを変更し、それが一連​​のリファクタリングを引き起こしました。最終的に起こったことは、JSON にシリアル化するときに精度を失うことなく逆シリアル化できるように、MyObjectElement を拡張した Type ごとに明示的な Lists を持つことを選択したことです。

于 2013-06-07T13:25:27.920 に答える