Работа с JSON на стороне сервера в ASP.NET и C # - PullRequest
2 голосов
/ 08 декабря 2010

Это продолжение моего вопроса здесь .Я пытаюсь понять, как сериализовать некоторые JSON.Я использую метод JSON.stringify () из json2.js для преобразования массива JSON в строковое значение, с которым я могу работать на стороне сервера.Мой JSON изначально выглядит так:

var myItems = {
    "data": [
      {"id":1, "type":2, "name":"book"},
      {"id":2, "type":3, "name":"dvd"},
      {"id":3, "type":4, "name":"cd"}
    ]
};

После того, как я использую JSON.stringify, я заметил, что значение на сервере выглядит следующим образом:

{"data":[{"id":1,"type":2,"name":"book"},{"id":2,"type":"3","name":"dvd"},{"id":3,"type":4,"name":"cd"}]}

В попыткесериализовав этот JSON в объекты C #, с которыми я могу работать, я написал следующий код:

public MyItems GetMyItems() 
{
  MyItems items = new MyItems();

  string json = serializedJsonInHiddenHtmlElement.Value;
  if (json.Length > 0)
  {
    items = Deserialize<MyItems>(json);
  }
  return items;
}

public static T Deserialize<T>(string json)
{
  using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
  {
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
    return (T)serializer.ReadObject(ms);
  }
}

Классы, связанные с моими типами, определяются следующим образом:

[DataContract(Name="myItems")]
internal class MyItems
{
    [DataMember(Name = "data")]
    public string[] Data { get; set; }
}

[DataContract(Name="myItem")]
internal class MyItem
{
    [DataMember(Name = "id")]
    public string ID { get; set; }

    [DataMember(Name = "type")]
    public string Type { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }    
}

Когда я выполняюэтот код, строка с надписью return (T)serializer.ReadObject(ms); Я получаю сообщение об ошибке:

There was an error deserializing the object of type AppNamespace.MyItems. End element 'item' from namespace '' expected. Found element 'id' from namespace ''.

Что я делаю не так?Я не могу пройти через это.Может кто-нибудь, пожалуйста, укажите мне в правильном направлении?Спасибо!

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Вы можете сначала попытаться создать объект MyItems на сервере и сериализовать его.Чтобы увидеть, как выглядит выходной JSON.Я не использовал DataContractJsonSerializer, но думаю, что атрибуты wcf заставляют его неправильно интерпретировать json.

Кроме того, не следует:

public string[] Data { get; set; }

быть

public MyItem[] Data { get; set; }

1 голос
/ 08 декабря 2010

Что такое "Deserialize (" в вашем коде .. из какого пространства имен вы используете метод десериализации?

Если это проект asp.net, если asp.net 3.5+, вы должны быть в состояниииспользовать расширения Microsoft AJAX со встроенной десериализацией JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...