44 votes

Sérialiser/désérialiser un tableau d'octets dans JSON.NET

J'ai une classe simple avec la propriété suivante :

 [JsonObject(MemberSerialization.OptIn)]
public class Person
{
    ...
    [JsonProperty(PropertyName = "Photograph"]
    public byte[] Photograph { get; set; }
    ...
}

mais cela ne fonctionne pas lorsque je remplis la propriété Photograph avec une image et que je transfère sur http. Cela peut sembler une question simple, mais je n'ai pas encore trouvé de solution après avoir cherché en ligne pendant des heures, mais comment sérialiser/désérialiser un tableau d'octets dans Json.NET ? De quelles balises d'attribut ai-je besoin ou devrais-je procéder autrement ? Merci beaucoup!

37voto

Alexey Zimarev Points 517
public static T Deserialize<T>(byte[] data) where T : class
{
    using (var stream = new MemoryStream(data))
    using (var reader = new StreamReader(stream, Encoding.UTF8))
        return JsonSerializer.Create().Deserialize(reader, typeof(T)) as T;
}

28voto

Oliver Points 2004

Vous pouvez convertir l'octet[] en chaîne puis utiliser la méthode JsonConvert pour obtenir l'objet :

 var bytesAsString = Encoding.UTF8.GetString(bytes);
var person = JsonConvert.DeserializeObject<Person>(bytesAsString);

7voto

dana Points 4890

Si vous utilisez LINQ to JSON , vous pouvez procéder comme suit :

 JObject.Parse(Encoding.UTF8.GetString(data));

Le résultat sera un JObject dynamique.

Bien que ce ne soit peut-être pas exactement ce que le PO cherchait à faire, cela pourrait être utile pour d'autres qui cherchent à désérialiser un byte[] qui rencontrent cette question.

0voto

Nae Points 5451

Sur la base de cette réponse, vous pouvez utiliser celle ci-dessous dans net core :

 using System.IO;
using System.Text.Json;
using System.Threading.Tasks;

namespace <MyNameSpace>
{
    public static class ByteArrayExtensions
    {
        public static async Task<T> Deserialize<T>(this byte[] data) where T : class
        {
            using (var stream = new MemoryStream(data))
            {
                return await JsonSerializer.DeserializeAsync(stream, typeof(T)) as T;
            }
        }
    }
}

Ce qui peut être considéré comme ayant l'avantage sur la lisibilité :

 var Deserialized = await mySerializedByteArray.Deserialize<MyObjectClass>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X