1

Visual C# 4.0 のバックエンドとの間で JSON をポストおよび取得するアプリケーションを作成しています。

明らかに、JSON をシリアル化/逆シリアル化する最も簡単な方法は System.Web.Script.Serialization.JavaScriptSerializer ですが、その型が null であると主張して ArgumentNullException をスローしている奇妙なエラーが発生しています。

次の JSON を逆シリアル化すると、正常に動作します。

 {"results":[
      {"Name":"Western Bulldogs",
      "updatedAt":"2011-08-22T09:09:09.673Z",
      "Nickname":"Bulldogs",
      "RemoteId":44,
      "Abbreviation":"WB",
      "createdAt":"2011-08-22T09:09:09.673Z",
      "objectId":"2iSK8FDTA6"}
 ]}

ただし、(ネストされた辞書を使用して) 2 番目のものを逆シリアル化すると、type is null エラーで失敗します。

{"results":[
    {"EndDate":{"iso":"2011-09-06T00:00:00.000Z","__type":"Date"},
    "Name":"Round 24",
    "updatedAt":"2011-08-22T08:33:54.119Z",
    "RemoteId":800,"createdAt":"2011-08-22T08:33:54.119Z",
    "Season":{"className":"Season","__type":"Pointer","objectId":"WnsdqIlrd6"},
    "Order":24,
    "StartDate":{"iso":"2011-08-30T00:00:00.000Z","__type":"Date"},
    "objectId":"bLdBfhagi9"}
]}        

参考までに、両方のクエリに対して次の方法で逆シリアル化しています。

JavaScriptSerializer jsSerialise = new JavaScriptSerializer();
ObjectIdContainerList contList = jsSerialise.Deserialize<ObjectIdContainerList>(responseString);

ObjectIdContainerList は次のとおりです (注 - objectId プロパティの取得のみに関心があるため、元の JSON オブジェクトのすべてのプロパティを実装しているわけではありません)。

[Serializable]
public class ObjectIdContainerList
{
    public ObjectIdContainer[] results { get; set; }
}

[Serializable]
public class ObjectIdContainer
{
    public String objectId { get; set; }
}

最初のクエリは、まったく同じコードとオブジェクトで問題なく逆シリアル化されます。

助言がありますか?JSON.NETに行くだけでいいのでしょうか?

4

2 に答える 2

1

自分の質問に答えるのはちょっと気分が悪いですが、Json.Netを使用してオブジェクトをほぼ同じコードで逆シリアル化することで問題を解決し、うまくいきました。

これが .Net フレームワークのバグだとは言いたくありませんが、そのように感じます。

助けてくれた人に感謝します!

于 2011-08-23T08:30:27.993 に答える
1

これを簡単に実行できるはずの ObjectIdContainerList の目的がわかりません。

jsSerialise.Deserialize<List<ObjectIdContainer>>(responseString) 
and get a List of ObjectIdContainer

また、ObjectIdContainer に文字列を保持する「__type」というプロパティがあることも確認します。これは、C# のクラス プロパティの奇妙な名前であるため、言及します。

編集:残りのコードを投稿したのを見ました...

ObjectIdContainer には objectId というプロパティしかない場合に、応答文字列を ObjectIdContainer の配列に逆シリアル化できると期待しているということですか? あなたがそれをうまく機能させることができれば、私は非常に感銘を受けます。

Reflector が、JavascriptSerializer の実装は基本的にリフレクションを使用してオブジェクトをシリアル化/逆シリアル化することを示したことを覚えています。したがって、JSON オブジェクトで定義されているものと同じプロパティ名を持つ対応するクラスが必要です。そうしないと失敗します。

于 2011-08-23T03:25:50.907 に答える