Как сериализовать / десериализовать класс C #? - PullRequest
1 голос
/ 10 июня 2010

У меня есть объект в Javascript, который выглядит следующим образом

function MyObject(){
  this.name="";
  this.id=0;
  this.....
}

Затем я строю массив этих объектов и отправляю его в веб-службу ASP.Net.Я хочу десериализовать строку JSON, чтобы я мог легко работать с данными в C #.Затем я хочу отправить массив объектов того же типа Javascript (те же имена полей и все) обратно клиенту.То, что я не понимаю, это то, как сериализовать, скажем, этот класс:

class MyObject{
  public string Name;
  public int ID;
}

, чтобы JSON был таким же, как и вышеупомянутый объект JavaScript.А также, как десериализовать в класс C # MyObject.

Как бы я это сделал легко?Я использую Netwonsoft.Json.

Есть ли способ превратить строку JSON в список или массив объекта?

Ответы [ 3 ]

4 голосов
/ 10 июня 2010

с json.net вы можете использовать JsonPropertyAttribute , чтобы дать вашим сериализованным свойствам произвольное имя:

class MyObject{

    [JsonProperty(PropertyName = "name")]
    public string Name;

    [JsonProperty(PropertyName = "id")]
    public int ID;
}

затем вы можете сериализовать ваш объект в List <> следующим образом:

var list = new List<MyObject>();
var o = new MyObject();
list.Add(o);
var json = JsonConvert.SerializeObject(list);

и десериализация:

// json would look like this "[{ "name":"", "id":0 }]"
var list = JsonConvert.DeserializeObject<List<MyObject>>(json);
0 голосов
/ 12 июня 2010

Одна вещь, которую WebMethod возвращает вам, это оболочка "d", с которой я боролся часами, чтобы обойти.Мое решение с библиотекой Newtonsoft / JSON.NET приведено ниже.Возможно, есть более простой способ сделать это, и мне было бы интересно узнать.

public class JsonContainer
{
    public object d { get; set; }
}

public T Deserialize<T>(string json)
{
    JsonSerializer serializer = new JsonSerializer();

    JsonContainer container = (JsonContainer)serializer.Deserialize(new StringReader(json), typeof(JsonContainer));
    json = container.d.ToString();

    return (T)serializer.Deserialize(new StringReader(json), typeof(T));
}
0 голосов
/ 10 июня 2010

Вы можете попробовать DataContractJsonSerializer Рик Штрал Имеет довольно хороший пример.

Вы указываете сериализатору тип, к которому вы сериализуетесь, и вы можете декорировать свойства класса, говоря им ожидать другого имени.

Как пример:

class MyObject{ 
  [DataMember(name="name")]
  public string Name;
  [DataMember(name="id")] 
  public int ID; 
} 

РЕДАКТИРОВАТЬ: Используйте

using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
{
     ser = new DataContractJsonSerializer(typeof(MyObject)); 
     MyObject obj = ser.ReadObject(ms) as MyObject;

     int myObjID = obj.ID;
     string myObjName = obj.Name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...