6

次のような構造の js オブジェクトがあります。

object.property1 = "some string";
object.property2 = "some string";
object.property3.property1 = "some string";
object.property3.property2 = "some string";
object.property3.property2 = "some string";

JSON.stringify(object) を使用して、これを ajax リクエストで渡します。JavaScriptSerializer.Deserialize を辞書として使用してこれを逆シリアル化しようとすると、次のエラーが発生します。

'System.String' の型に対して定義されたパラメーターなしのコンストラクターはありません。

これとまったく同じプロセスが、「コレクション」以外のプロパティを持つ通常のオブジェクトでも機能します。助けてくれてありがとう!

4

2 に答える 2

9

これは、デシリアライザーがサブオブジェクトの処理方法を認識していないためです。あなたがJSに持っているのはこれです:

var x = {
  'property1' : 'string',
  'property2' : 'string',
  'property3' : { p1: 'string', p2: 'string', p3: 'string' },
};

C# で有効なものへのマップがありません。

HashTable h = new HashTable();
h.Add("property1", "string");
h.Add("property2", "string");
h.Add("property3", ???);

??? ここではタイプが定義されていないため、デシリアライザーは JS の匿名オブジェクトが何を表しているかをどのように知るのでしょうか?

編集

ここで達成しようとしていることを実行する方法はありません。オブジェクトを型付けする必要があります。たとえば、次のようにクラスを定義します。

class Foo{
  string property1 { get; set; } 
  string property2 { get; set; }
  Bar property3 { get; set; } // "Bar" would describe your sub-object
}

class Bar{
  string p1 { get; set; }
  string p2 { get; set; }
  string p3 { get; set; }
}

...またはその趣旨の何か。

于 2010-06-02T16:33:14.833 に答える
0

より一般的な答えとして、私の場合、次のようなオブジェクトがありました。

{ "field1" : "value", "data" : { "foo" : "bar" } }

辞書構文を使用するオブジェクトに対してMSDNDictionary<string, string>で指定されているはずのデータ フィールドを文字列として持っていました。

public class Message
{
   public string field1 { get; set; }

   public Dictionary<string, string> data { get; set; }
}
于 2011-10-25T21:11:48.710 に答える