.NET Framework
JSON Serialisering
Sök…
Anmärkningar
JavaScriptSerializer vs Json.NET
Klassen JavaScriptSerializer
introducerades i .NET 3.5 och används internt av .NETs asynkrona kommunikationslager för AJAX-aktiverade applikationer. Det kan användas för att arbeta med JSON i hanterad kod.
Trots förekomsten av JavaScriptSerializer
klassen rekommenderar Microsoft att använda Json.NET-biblioteket med öppen källkod för serialisering och deserialisering. Json.NET erbjuder bättre prestanda och ett vänligare gränssnitt för att mappa JSON till anpassade klasser (ett anpassat JavaScriptConverter
objekt skulle behövas för att åstadkomma detsamma med JavaScriptSerializer
).
Deserialisering med System.Web.Script.Serialization.JavaScriptSerializer
Metoden JavaScriptSerializer.Deserialize<T>(input)
försöker deserialisera en sträng med giltig JSON till ett objekt av den angivna typen <T>
, med hjälp av de standardmappningar som nativt stöds av JavaScriptSerializer
.
using System.Collections;
using System.Web.Script.Serialization;
// ...
string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
JavaScriptSerializer JSS = new JavaScriptSerializer();
Dictionary<string, object> parsedObj = JSS.Deserialize<Dictionary<string, object>>(rawJSON);
string name = parsedObj["Name"].toString();
ArrayList numbers = (ArrayList)parsedObj["Numbers"]
Obs: JavaScriptSerializer
objektet introducerades i .NET-version 3.5
Deserialisering med Json.NET
internal class Sequence{
public string Name;
public List<int> Numbers;
}
// ...
string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
Sequence sequence = JsonConvert.DeserializeObject<Sequence>(rawJSON);
Mer information finns på den officiella webbplatsen Json.NET .
Obs: Json.NET stöder .NET version 2 och högre.
Serialisering med Json.NET
[JsonObject("person")]
public class Person
{
[JsonProperty("name")]
public string PersonName { get; set; }
[JsonProperty("age")]
public int PersonAge { get; set; }
[JsonIgnore]
public string Address { get; set; }
}
Person person = new Person { PersonName = "Andrius", PersonAge = 99, Address = "Some address" };
string rawJson = JsonConvert.SerializeObject(person);
Console.WriteLine(rawJson); // {"name":"Andrius","age":99}
Lägg märke till hur egenskaper (och klasser) kan dekoreras med attribut för att ändra deras utseende i resulterande json-sträng eller för att ta bort dem från json-strängen alls (JsonIgnore).
Mer information om Json.NET-serialiseringsattribut finns här .
I C # skrivs offentliga identifierare i PascalCase enligt konvention. I JSON är konventionen att använda camelCase för alla namn. Du kan använda en avtalslösare för att konvertera mellan de två.
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
[JsonIgnore]
public string Address { get; set; }
}
public void ToJson() {
Person person = new Person { Name = "Andrius", Age = 99, Address = "Some address" };
var resolver = new CamelCasePropertyNamesContractResolver();
var settings = new JsonSerializerSettings { ContractResolver = resolver };
string json = JsonConvert.SerializeObject(person, settings);
Console.WriteLine(json); // {"name":"Andrius","age":99}
}
Serialisering-deserialisering med Newtonsoft.Json
Till skillnad från de andra hjälparna, använder den här statiska klasshjälpare för att serialisera och deserialisera, därför är det lite lättare än de andra att använda.
using Newtonsoft.Json;
var rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
var fibo = JsonConvert.DeserializeObject<Dictionary<string, object>>(rawJSON);
var rawJSON2 = JsonConvert.SerializeObject(fibo);
Dynamisk bindning
Newtonsofts Json.NET låter dig binda json dynamiskt (med ExpandoObject / Dynamic-objekt) utan att behöva skapa typen uttryckligen.
serialisering
dynamic jsonObject = new ExpandoObject();
jsonObject.Title = "Merchent of Venice";
jsonObject.Author = "William Shakespeare";
Console.WriteLine(JsonConvert.SerializeObject(jsonObject));
De-serie
var rawJson = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
dynamic parsedJson = JObject.Parse(rawJson);
Console.WriteLine("Name: " + parsedJson.Name);
Console.WriteLine("Name: " + parsedJson.Numbers.Length);
Observera att nycklarna i rawJson-objektet har förvandlats till medlemsvariabler i det dynamiska objektet.
Detta är användbart i fall där en applikation kan acceptera / producera olika format av JSON. Det föreslås emellertid att använda en extra valideringsnivå för Json-strängen eller för det dynamiska objektet som genereras som ett resultat av serialisering / de-serialisering.
Serialisering med Json.NET med JsonSerializerSettings
Den här serien har några fina funktioner som standard .net json-serien inte har, som Null-värdehantering, du behöver bara skapa JsonSerializerSettings
:
public static string Serialize(T obj)
{
string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
return result;
}
Ett annat allvarligt serienummerproblem i .net är självreferensslingan. När det gäller en student som är inskriven i en kurs har dess instans en kursegenskap och en kurs har en samling studenter som betyder en List<Student>
som skapar en referensslinga. Du kan hantera detta med JsonSerializerSettings
:
public static string Serialize(T obj)
{
string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
return result;
}
Du kan lägga till olika serialiseringsalternativ som detta:
public static string Serialize(T obj)
{
string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
return result;
}