Come faccio a prendere un oggetto e convertirlo in una stringa JSON e poi di nuovo in quell'oggetto da una stringa, in particolare in WinRT per la mia applicazione Windows 8 Metro?Come de/serializzare JSON in WinRT?
17
A
risposta
38
Ti piace questa:
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
public static T Deserialize<T>(string json)
{
var _Bytes = Encoding.Unicode.GetBytes(json);
using (MemoryStream _Stream = new MemoryStream(_Bytes))
{
var _Serializer = new DataContractJsonSerializer(typeof(T));
return (T)_Serializer.ReadObject(_Stream);
}
}
public static string Serialize(object instance)
{
using (MemoryStream _Stream = new MemoryStream())
{
var _Serializer = new DataContractJsonSerializer(instance.GetType());
_Serializer.WriteObject(_Stream, instance);
_Stream.Position = 0;
using (StreamReader _Reader = new StreamReader(_Stream))
{ return _Reader.ReadToEnd(); }
}
}
5
Prima generare classi C# con http://json2csharp.com/ Quindi utilizzare http://james.newtonking.com/pages/json-net.aspx per il parsing
La mia classe utente attualmente appare così:
public class User
{
public string id { get; set; }
public string username { get; set; }
public string full_name { get; set; }
public string profile_picture { get; set; }
public string bio { get; set; }
public string website { get; set; }
public Counts counts { get; set; }
public static User SingleFromJSON(string jsonString)
{
return JsonConvert.DeserializeObject<SingleUser>(jsonString).data;
}
public static User MultipleFromJSON(string jsonString)
{
return JsonConvert.DeserializeObject<SingleUser>(jsonString).data;
}
private class SingleUser
{
public User data { get; set; }
}
private class MultipleUsers
{
public List<User> data { get; set; }
}
}
public class Counts
{
public int media { get; set; }
public int follows { get; set; }
public int followed_by { get; set; }
}
Super facile: D
+0
Questo è un altro modo, di sicuro. Non a tutti piacciono le biblioteche al di fuori del genere. Ma json.net è molto rispettato. (e veloce) –
DataContractJsonSerializer richiede che le classi e i membri siano contrassegnati con DataContract e DataMember. Json.net no. Il primo è più sicuro perché non tutte le classi possono essere completamente ricostruite dalle sole proprietà. Quest'ultimo è più veloce perché non si controlla sempre gli oggetti che si sta serializzando e la creazione di una classe intermediario serializzabile richiede un po 'più di tempo. – Tristan