2010-05-10 4 views
9

У меня есть некоторые простые объекты .NET, которые я хотел бы сериализовать в JSON и обратно. Набор объектов для сериализации довольно мал, и я контролирую реализацию, поэтому мне не нужно универсальное решение, которое будет работать на все. Поскольку моя сборка будет распространена как библиотека, мне бы очень хотелось избежать зависимости от сторонней DLL: я просто хочу предоставить пользователям одну сборку, которую они могут ссылаться.Действительно простая сериализация JSON в .NET

Я прочитал другие вопросы, которые я мог найти при конвертации в JSON и из него. Рекомендуемое решение JSON.NET действительно работает, но для этого требуется распространение дополнительной DLL.

Мне не нужны какие-либо причудливые функции JSON.NET. Мне просто нужно обработать простой объект (или даже словарь), который содержит строки, целые числа, DateTimes и массивы строк и байтов. При десериализации я рад получить словарь - ему не нужно снова создавать объект.

Есть ли какой-то действительно простой код, который я мог бы скомпилировать в свою сборку, чтобы выполнить эту простую работу?

Я также пробовал System.Web.Script.Serialization.JavaScriptSerializer, но там, где он падает, это массив байтов: я хочу, чтобы base64-кодировал его и даже зарегистрировал конвертер, не позволяет мне легко выполнить это из-за того, как работает API (он не передается имя поля).

+1

Вы рассматривали с помощью [ILMerge] (http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx), чтобы внедрить JSON.NET в вашу сборку? –

+0

Нет, но спасибо, что указали мне. Я думаю, что это может быть излишним для этого, но это выглядит очень интересным инструментом, и я подумаю об использовании его для чего-то еще, над чем я работаю. +1 – EMP

+1

Если данные JSON содержат строку, вероятно, стоит использовать такой пакет, как JSON.NET, чтобы обрабатывать его для вас, вместо того, чтобы кататься самостоятельно. Например, как вы обрабатываете пробелы в своих строках? Или одиночные/двойные кавычки в строке? Newlines? –

ответ

4

Json.NET имеет лицензию MIT, вы можете просто загрузить источник и включить только те файлы, которые вам нужны для вашего приложения.

+0

Я закончил работу над проблемой в 'System.Web.Script.Serialization.JavaScriptSerializer', но принял это, потому что это, вероятно, то, что я сделал бы иначе. – EMP

+0

@ Evgeny - Вы можете немного рассказать о том, как вы работали над этой проблемой кодирования массива байтов? У меня такая же проблема, и я предпочел бы избежать использования сторонней библиотеки, такой как JSON.net, если возможно – InSane

+0

@InSane, к сожалению, я не помню на этом этапе и больше не имею доступа к этому коду. Возможно, я просто base-64 закодировал массив внутри объекта или закончил с помощью конвертера с подполем - см. Ответ, который я только что опубликовал. – EMP

4

Возможный обходной путь, который позволяет использовать рамки .NET JavaScriptSerializer является зарегистрировать конвертер, который базовое 64 кодирует массивы байт в подпол, как это:

class ByteArrayBase64Converter : JavaScriptConverter 
{ 
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     return Convert.FromBase64String((string)dictionary["b64"]); 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     return new Dictionary<string, object> { { "b64", Convert.ToBase64String((byte[])obj) } }; 
    } 

    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return new[] { typeof(byte[])}; } 
    } 
} 


var serializer = new JavaScriptSerializer(); 
serializer.RegisterConverters(new JavaScriptConverter[] { new ByteArrayBase64Converter() }); 
Смежные вопросы