2010-05-10 16 views
9

Mam kilka prostych obiektów .NET Chciałbym serializować do JSON iz powrotem. Zestaw obiektów do serializacji jest dość mały i kontroluję implementację, więc nie potrzebuję ogólnego rozwiązania, które będzie działało na wszystko. Ponieważ mój zestaw będzie dystrybuowany jako biblioteka, naprawdę chciałbym uniknąć zależności od biblioteki DLL innej firmy: chcę tylko dać użytkownikom jeden zespół, do którego mogą się odwoływać.Naprawdę prosta serializacja JSON w .NET

Czytałem inne pytania, które mogłem znaleźć na temat konwersji do iz JSON w .NET. Zalecane rozwiązanie JSON.NET działa oczywiście, ale wymaga dystrybucji dodatkowej biblioteki DLL.

Nie potrzebuję żadnych ciekawych funkcji JSON.NET. Potrzebuję tylko obsługi prostego obiektu (lub nawet słownika), który zawiera ciągi, liczby całkowite, DateTimes i tablice ciągów i bajtów. Przy deserializacji jestem szczęśliwy, że mogę odzyskać słownik - nie trzeba go ponownie tworzyć.

Czy istnieje jakiś naprawdę prosty kod, który mógłbym skompilować do mojego zespołu, aby wykonać tę prostą pracę?

Próbowałem również , ale tam, gdzie spada, jest tablica bajtów: chcę ją kodować64, a nawet zarejestrowanie konwertera nie pozwala mi tego łatwo osiągnąć z powodu sposobu działania API (to nie przechodzi w nazwę pola).

+1

Czy bierzesz za pomocą [ILMerge] (http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx) do osadzenia JSON.NET w swoim zespole? –

+0

Nie, ale dziękuję za wskazanie mi tego. Myślę, że to może być przesada, ale wygląda na bardzo ciekawe narzędzie i rozważę użycie go do czegoś innego nad czym pracuję. +1 – EMP

+1

Jeśli dane JSON zawierają ciąg znaków, prawdopodobnie warto użyć pakietu takiego jak JSON.NET, aby poradzić sobie z nim, zamiast tworzyć własne. Na przykład, w jaki sposób obsługiwać spacje w łańcuchach? Lub pojedyncze/podwójne cudzysłowy w ciągu? Newlines? –

Odpowiedz

4

jest licencjonowany na licencji MIT. Wystarczy pobrać źródło i uwzględnić tylko te pliki, które są potrzebne do danej aplikacji.

+0

Zakończyłem pracę nad problemem w "System.Web.Script.Serialization.JavaScriptSerializer", ale akceptując to, ponieważ jest to prawdopodobnie to, co zrobiłbym inaczej. – EMP

+0

@Evgeny - Czy możesz trochę wyjaśnić, jak pracujesz nad tym zagadnieniem kodowania tablicy bajtów? Mam ten sam problem i wolałbym nie używać biblioteki trzeciej strony, takiej jak JSON.net, jeśli to możliwe. – InSane

+0

@InSane niestety nie pamiętam na tym etapie i nie mam już dostępu do tego kodu. Być może po prostu base-64 zakodował tablicę wewnątrz obiektu lub skończył używając konwertera z podpolem - zobacz odpowiedź, którą właśnie napisałem. – EMP

4

Możliwe obejście, które pozwala na wykorzystanie .NET Framework JavaScriptSerializer się zarejestrować konwerter, który koduje base-64 tablic bajtowych w sub-dziedzinie, podobnie jak to:

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() }); 
Powiązane problemy