Jeg har en objektmodel, der ser således ud:
public MyObjectInJson
{
public long ObjectID {get;set;}
public string ObjectInJson {get;set;}
}
Ejendommen ObjectInJson
er en allerede serialiseret version et objekt, der indeholder indlejrede lister. I øjeblikket serialiserer jeg listen af MyObjectInJson
manuelt på denne måde:
StringBuilder TheListBuilder = new StringBuilder();
TheListBuilder.Append("[");
int TheCounter = 0;
foreach (MyObjectInJson TheObject in TheList)
{
TheCounter++;
TheListBuilder.Append(TheObject.ObjectInJson);
if (TheCounter != TheList.Count())
{
TheListBuilder.Append(",");
}
}
TheListBuilder.Append("]");
return TheListBuilder.ToString();
Jeg spekulerer på, om jeg kan erstatte denne slags farlig kode med JavascriptSerializer
og få de samme resultater.
Hvordan ville jeg gøre dette?
Tak.
Standard er at bruge den indbyggede System.Text.Json
-parserimplementation.
f.eks.
using System.Text.Json;
var json = JsonSerializer.Serialize(aList);
alternativt kan du overveje Utf8Json parser, den er mindre udbredt, men synes at være meget hurtig. Den serialiseres til et byte array, så den kunne naivt bruges på denne måde,
using Utf8Json;
var json = System.Text.Encoding.UTF8.GetString(JsonSerializer.Serialize(aList));
du skal muligvis installere pakken først.
PM> Install-Package Utf8Json
Standard til at bruge Newtonsoft JSON.Net som dit første valg JSON Parser.
f.eks.
using Newtonsoft.Json;
var json = JsonConvert.SerializeObject(aList);
skal du muligvis installere pakken først.
PM> Install-Package Newtonsoft.Json
For flere detaljer se og upvote det svar, der er kilden til disse oplysninger.
// you need to reference System.Web.Extensions
using System.Web.Script.Serialization;
var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);
Der er to almindelige måder at gøre det på med indbyggede JSON-serialiserere:
var serializer = ny JavaScriptSerializer();
return serializer.Serialize(TheList);
var serializer = new DataContractJsonSerializer(TheList.GetType());
using (var stream = ny MemoryStream())
{
serializer.WriteObject(stream, TheList);
using (var sr = ny StreamReader(stream))
{
return sr.ReadToEnd();
}
}
Bemærk, at denne mulighed kræver, at der defineres en datakontrakt for din klasse:
[DataContract]
public class MyObjectInJson
{
[DataMember]
public long ObjectID {get;set;set;}
[DataMember]
public string ObjectInJson {get;set;}
}
.NET understøtter allerede grundlæggende Json-serialisering via System.Runtime.Serialization.Json-navnsrummet og DataContractJsonSerializer-klassen siden version 3.5. Som navnet antyder, tager DataContractJsonSerializer hensyn til eventuelle dataannotationer, du tilføjer til dine objekter, for at skabe det endelige Json-output.
Det kan være praktisk, hvis du allerede har annoterede dataklasser, som du ønsker at serialisere Json til en stream, som beskrevet i Sådan serialiserer og deserialiserer du JSON-data. Der er begrænsninger, men det er godt nok og hurtigt nok, hvis du har grundlæggende behov og ikke ønsker at tilføje endnu et bibliotek til dit projekt.
Den følgende kode serialiserer en liste til konsolens output stream. Som du kan se er det en bit mere omstændelig end Json.NET og ikke type-sikker (dvs. ingen generics)
var list = new List<string> {"a", "b", "c", "d"};
using(var output = Console.OpenStandardOutput())
{
var writer = new DataContractJsonSerializer(typeof (List<string>));
writer.WriteObject(output,list);
}
På den anden side giver Json.NET meget bedre kontrol over, hvordan du genererer Json. Dette vil være MEGET praktisk, når du skal mappe javascript-venlige navne navne til .NET-klasser, formatere datoer til json osv.
En anden mulighed er ServiceStack.Text, der er en del af ServicStack ... stakken, som giver et sæt meget hurtige serialiserere til Json, JSV og CSV.