Действительно простая сериализация JSON в .NET - PullRequest
9 голосов
/ 10 мая 2010

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Возможный обходной путь, который позволяет использовать .NET Framework JavaScriptSerializer, - зарегистрировать преобразователь, который base-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() });
4 голосов
/ 10 мая 2010

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

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