Способ десериализации JSON из HttpWebResponse без сторонних фреймворков - PullRequest
2 голосов
/ 02 августа 2010

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

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

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

1 Ответ

10 голосов
/ 03 августа 2010

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);

Update: Добавлен вспомогательный класс

Вот пример вспомогательного класса, который вы можете использовать для простой сериализации 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);
        }
    }
}
...