JavaScriptSerializer десериализует объект «коллекция» как свойство в объекте с ошибкой - PullRequest
6 голосов
/ 02 июня 2010

У меня есть объект 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 (объект), чтобы передать это с помощью запроса ajax. Когда я пытаюсь десериализовать это, используя JavaScriptSerializer.Deserialize как словарь, я получаю следующую ошибку:

Для типа 'System.String' не определен конструктор без параметров.

Этот точно такой же процесс работает для обычного объекта со свойствами, отличными от "коллекции". Спасибо за любую помощь!

Ответы [ 2 ]

9 голосов
/ 02 июня 2010

Это потому, что десериализатор не знает, как обрабатывать подобъект. Что у вас есть в 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; }
}

... или что-то в этом роде.

0 голосов
/ 26 октября 2011

В качестве более общего ответа, в моем случае у меня были объекты, которые выглядели так:

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

У меня изначально было поле данных в виде строки, когда оно должно было быть Dictionary<string, string>, как указано в MSDN для объектов, которые используют синтаксис словаря.

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

   public Dictionary<string, string> data { get; set; }
}
...