Wie nehme ich ein Objekt und wandle es in eine JSON-Zeichenfolge und dann zurück in dieses Objekt aus einer Zeichenfolge, speziell in WinRT für meine Windows 8 Metro-Anwendung?Wie kann ich JSON in WinRT de/serialisieren?
17
A
Antwort
38
So:
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
Erste C# -Klassen mit http://json2csharp.com/ Dann nutzen http://james.newtonking.com/pages/json-net.aspx zum Parsen
Mein Benutzerklasse generieren sieht derzeit wie folgt aus:
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 einfach: D
+0
Das ist natürlich ein anderer Weg. Nicht jeder mag solche Bibliotheken. Aber json.net ist gut respektiert. (und schnell) –
DataContractJsonSerializer erfordert, dass Klassen und Member mit DataContract und DataMember gekennzeichnet sind. Json.net nicht. Ersteres ist sicherer, weil nicht alle Klassen vollständig aus ihren Eigenschaften allein wiederhergestellt werden können. Letzteres ist schneller, da Sie die Objekte, die Sie serialisieren, nicht immer kontrollieren und das Erstellen einer serialisierbaren Zwischenklasse etwas länger dauert. – Tristan