0

次のチュートリアルを検討してください: http://blogs.msdn.com/b/rakkimk/archive/2009/01/30/asp-net-json-serialization-and-deserialization.aspx

{
    "firstName" : "Rakki",
    "lastName" : "Muthukumar",
    "department" : "Microsoft PSS",
    "address" : {
        "addressline1" : "Microsoft India GTSC",
        "addressline2" : "PSS - DSI",
        "city" : "Bangalore",
        "state" : "Karnataka",
        "country" : "India",
        "pin" : 560028
    },
"technologies" : ["IIS", "ASP.NET", "JavaScript", "AJAX"]    
}

json コードの場合、次のクラスがあります。

    public class Address
{
public string addressline1 { get; set; }
public string addressline2 { get; set; }
public string city { get; set; }
public string state { get; set; }
public string country { get; set; }
public int pin { get; set; }
}

public class RootObject
{
public string firstName { get; set; }
public string lastName { get; set; }
public string department { get; set; }
public Address address { get; set; }
public List<string> technologies { get; set; }
}

上記のプロパティは、次のようなデータを設定しようとするとエラーになります

RootObjectClsObject.address.addressline1 = "NO";

それは私を投げますNullReferrenceException。行を変更すると

public List<string> technologies { get;set;}

次の行で

public List<string> technologies = new List<string>();

使いたくないもの。この方法では処理できない複雑なタイプの JSON があるためです。

4

2 に答える 2

1

サブオブジェクトを初期化していません。プロパティにはまだオブジェクトのaddressインスタンスが割り当てられていないAddressため、プロパティを更新しようとするとaddress1; アプリケーションは、参照しているオブジェクトを認識していないため、エラーが発生します。

プロパティに値を割り当てるaddressか、デフォルト値で初期化するだけです。

これを行う最も簡単な方法は、RootObjectクラスのデフォルト コンストラクターを使用することです。

public class RootObject
{
   public RootObject()
   {
      address = new Address();
      technologies = new List<string>();
   }

    public string firstName { get; set; }
    public string lastName { get; set; }
    public string department { get; set; }
    public Address address { get; set; }
    public List<string> technologies { get; set; }
}
于 2013-01-14T11:24:03.440 に答える
1

@Kami が示唆したように、のコンストラクターで and を初期化するかaddress、次の構文を使用して(および他のオブジェクトのプロパティ) を割り当てることができます。technologiesRootObjectaddressline1address

RootObjectClsObject.address = new Address()
{
    addressline1 = "NO"
};
于 2013-01-14T11:45:25.407 に答える