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;
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow