Способ десериализации JSON из HttpWebResponse без сторонних фреймворков

Я пытаюсь не зависеть от библиотек с открытым исходным кодом или сторонних библиотек, таких как Json.NET, для анализа входящего JSON из HttpWebResponse. Почему? Потому что чем больше вы полагаетесь на фреймворки с открытым исходным кодом для помощи в своих реализациях, тем больше ваше приложение должно полагаться на эти зависимости... Мне не нравится, чтобы мои приложения зависели от множества библиотек по многим причинам, если это вообще возможно. Я согласен использовать такие вещи, как Enterprise Library, потому что она поддерживается MS, но я беру больше библиотек с открытым исходным кодом.

В любом случае, я пытаюсь найти лучший способ анализа входящего JSON на стороне сервера в .NET 3.5.

Я знаю, что это вызовет много откликов, и я даже использовал .NET 3.5 JavaScriptSerializer для сериализации данных в JSON, но теперь я пытаюсь найти лучший и самый простой способ сделать обратное, не повторяя чтобы помочь в этом использовать стороннюю структуру / структуру с открытым исходным кодом.


person PositiveGuy    schedule 02.08.2010    source источник


Ответы (1)


Рекомендуемый Microsoft сериализатор JSON: DataContractJsonSerializer Этот класс существует в сборке System.Runtime.Serialization.

В примере демонстрируется десериализация данных JSON в объект.

MemoryStream stream1 = new MemoryStream();     
Person p2 = (Person)ser.ReadObject(stream1);

Чтобы сериализовать экземпляр типа Person в JSON, сначала создайте DataContractJsonSerializer и используйте метод WriteObject для записи данных JSON в поток.

Person p = new Person();
//Set up Person object...
MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
ser.WriteObject(stream1, p);

Обновление: добавлен вспомогательный класс

Вот пример вспомогательного класса, который можно использовать для простой сериализации To/From Json:

public static class JsonHelper
{
    public static string ToJson<T>(T instance)
    {
        var serializer = new DataContractJsonSerializer(typeof(T));
        using (var tempStream = new MemoryStream())
        {
            serializer.WriteObject(tempStream, instance);
            return Encoding.Default.GetString(tempStream.ToArray());
        }
    }

    public static T FromJson<T>(string json)
    {
        var serializer = new DataContractJsonSerializer(typeof(T));
        using (var tempStream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
        {
            return (T)serializer.ReadObject(tempStream);
        }
    }
}
person Wallace Breza    schedule 02.08.2010
comment
Вы случайно не знаете, когда был создан этот класс? Это означает, что мне интересно, является ли это более новым классом фреймворка, чем, скажем, сериализация JavaScript .NET 3.5. Потому что я бы предпочел использовать все, что является последним, поскольку оно, вероятно, не устареет так скоро... если вообще устареет. - person PositiveGuy; 03.08.2010
comment
@CoffeeAddict, я добавил пример вспомогательного класса, который обеспечивает как сериализацию, так и десериализацию. - person Wallace Breza; 03.08.2010
comment
где вы видели, что MS рекомендует это .. Я на MSDN, но не вижу этого. - person PositiveGuy; 03.08.2010
comment
DataContractJsonSerializer новее и вышла с .NET 3.5. JavaScriptSerializer изначально был представлен в расширениях ASP.NET 1.0 для ASP.NET 2.0. - person Wallace Breza; 03.08.2010
comment
Да, видите это. Я просто пытаюсь выяснить, в каком направлении идти сюда в основном сейчас. JavaScriptSerializer против DataContract - person PositiveGuy; 03.08.2010
comment
Спасибо за пример, он очень помогает понять больше о DataJsonSerializer. - person PositiveGuy; 03.08.2010
comment
Я думаю, вы также можете использовать объект WebClient для десериализации в строку с помощью метода WebClient.DownloadString() - person PositiveGuy; 03.08.2010