Ik heb een object met een aantal 'nested' sub-objecten welke ik graag naar JSON wil serializen met JSON.NET. Ik moet echter tijdens runtime kunnen bepalen welke members (van zowel het hoofd object als de sub-objecten) in de JSON moeten komen en welke niet. Daarvoor heb ik een lijstje met member names (strings).
Stel bijvoorbeeld dat ik een object RaceCarDriver heb met een naam, een Fastest Laptime en een Last laptime, beide van type Laptime:
Nu wil ik een RaceCarDriver serializen, maar ik wil enkel de naam, en de 'MilliSeconds' property van de Laptime properties. Ik heb dus een lijstje met de volgende member names die ik wil serializen:
Let op dat ik hier de NAAM van de property (FastestLap / LastLap) gebruik en niet het TYPE (Laptime), dat is belangrijk. Het zou namelijk kunnen zijn dat ik van de FastestLap de Milliseconds wil maar van de LastLap alleen de Lap:
Er moet dus onderscheid gemaakt worden op property naam en niet op type (Laptime) anders is het niet duidelijk voor welke property van dat type de member name geldt (indien er meerdere van hetzelfde type zijn zoals hier).
Dit lijstje met member names wordt tijdens runtime aangemaakt.
Hoe kan ik nu een RaceCarDriver object serializeren rekening houdend met de properties die ik wil hebben?
Ik ben aan het kijken naar een custom ContractSerializer door een subclass van DefaultContractResolver te maken. Daar kan ik een aantal methods overriden die er nuttig uit zien, bijvoorbeeld CreateProperties, waar ik een lijstje JsonProperties krijg waar uit ik properties kan gooien die ik niet wil (omdat ze niet in de lijst voorkomen).
Het probleem wat ik overal tegenkom is echter steeds hetzelfde: als ik twee properties met hetzelfde type heb (zoals de Laptime properties in het voorbeeld) dan kan ik geen onderscheid maken. Ik heb in mijn lijstje de NAAM van de property (FastestLaptime) maar in elk van deze methods kan ik alleen het type vinden (Laptime) dus weet ik niet welke van de twee (of meer) properties ik op dit moment aan het serializen ben en dus welke ik moet toelaten en welke niet.
Ik kan wel bij de PropertyName van de huidige property (dat zou bijvoorbeeld "MilliSeconds" of "Lap" zijn), maar niet bij de PropertyName van de parent property (ofwel "FastestLapt" of "LastLap"), maar enkel het type van de parent ("Laptime") waar ik dus niks aan heb.
Hoe kom ik hier aan de NAAM van de parent property (ipv het type) zodat ik kan bepalen of die property mee moet komen of niet?
Dit zou toch wel mogelijk moeten zijn, want JSON.NET kan dit object prima serializen naar JSON waarbij het sub-object gewoon 'FastestLap' heet en niet 'Laptime'. Ik kan echter niet vinden hoe ik aan die informatie kom. Als ik het JsonProperty object inspecteer zie ik nergens de naam van de parent property terug komen, enkel het type...
Stel bijvoorbeeld dat ik een object RaceCarDriver heb met een naam, een Fastest Laptime en een Last laptime, beide van type Laptime:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public class RaceCarDriver { public string Name {get; set;} public Laptime FastestLap {get; set;| public Laptime LastLap {get; set;} } public class Laptime { public TimeSpan Time {get; set;} public int MilliSeconds {get; set;} public int Lap {get; set;} } |
Nu wil ik een RaceCarDriver serializen, maar ik wil enkel de naam, en de 'MilliSeconds' property van de Laptime properties. Ik heb dus een lijstje met de volgende member names die ik wil serializen:
code:
1
2
3
| Name FastestLap.MilliSeconds LastLap.MilliSeconds |
Let op dat ik hier de NAAM van de property (FastestLap / LastLap) gebruik en niet het TYPE (Laptime), dat is belangrijk. Het zou namelijk kunnen zijn dat ik van de FastestLap de Milliseconds wil maar van de LastLap alleen de Lap:
code:
1
2
3
| Name FastestLap.MilliSeconds LastLap.Lap |
Er moet dus onderscheid gemaakt worden op property naam en niet op type (Laptime) anders is het niet duidelijk voor welke property van dat type de member name geldt (indien er meerdere van hetzelfde type zijn zoals hier).
Dit lijstje met member names wordt tijdens runtime aangemaakt.
Hoe kan ik nu een RaceCarDriver object serializeren rekening houdend met de properties die ik wil hebben?
Ik ben aan het kijken naar een custom ContractSerializer door een subclass van DefaultContractResolver te maken. Daar kan ik een aantal methods overriden die er nuttig uit zien, bijvoorbeeld CreateProperties, waar ik een lijstje JsonProperties krijg waar uit ik properties kan gooien die ik niet wil (omdat ze niet in de lijst voorkomen).
Het probleem wat ik overal tegenkom is echter steeds hetzelfde: als ik twee properties met hetzelfde type heb (zoals de Laptime properties in het voorbeeld) dan kan ik geen onderscheid maken. Ik heb in mijn lijstje de NAAM van de property (FastestLaptime) maar in elk van deze methods kan ik alleen het type vinden (Laptime) dus weet ik niet welke van de twee (of meer) properties ik op dit moment aan het serializen ben en dus welke ik moet toelaten en welke niet.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| public class DriverContractResolver : DefaultContractResolver { private readonly List<string> _members; public DriverContractResolver(IEnumerable<string> members) { _members = new List<string>(members); } protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var p = base.CreateProperty(member, memberSerialization); // Hier kan ik eventueel de property niet toelaten via: p.ShouldSerialize = x => false; return p; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { var properties = base.CreateProperties(type, memberSerialization); // Hier kan ik eventueel filteren bijv: properties = properties.Where(p => p.PropertyName == "A").ToList(); return properties; } } |
Ik kan wel bij de PropertyName van de huidige property (dat zou bijvoorbeeld "MilliSeconds" of "Lap" zijn), maar niet bij de PropertyName van de parent property (ofwel "FastestLapt" of "LastLap"), maar enkel het type van de parent ("Laptime") waar ik dus niks aan heb.
Hoe kom ik hier aan de NAAM van de parent property (ipv het type) zodat ik kan bepalen of die property mee moet komen of niet?
Dit zou toch wel mogelijk moeten zijn, want JSON.NET kan dit object prima serializen naar JSON waarbij het sub-object gewoon 'FastestLap' heet en niet 'Laptime'. Ik kan echter niet vinden hoe ik aan die informatie kom. Als ik het JsonProperty object inspecteer zie ik nergens de naam van de parent property terug komen, enkel het type...
[ Voor 4% gewijzigd door NickThissen op 24-01-2015 13:05 ]