Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/WindowsPhone] Parsen van variable JSON-elementen

Pagina: 1
Acties:

  • Rhndy
  • Registratie: Februari 2010
  • Laatst online: 04-06 09:32
Beste Tweakers,

Heb me rot gezocht op internet maar kom er echt niet meer uit..
Ik heb een JSON-string:
JSON:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
{
    "1213": {
        "32001214": {
        "Passes": {
                "HTM_663051_3_39920_0": {
                    "IsTimingStop": false,
                    "DestinationName50": "Den Haag Loosduinen",
                    "DataOwnerCode": "HTM",
                    "FortifyOrderNumber": 0,
                    "TransportType": "TRAM",
                    "Longitude": 4.25565,
                    "Latitude": 52.07097,
                    "JourneyNumber": 39920,
                    "JourneyPatternCode": 44782,
                    "LocalServiceLevelCode": 663051,
                    "LineDirection": 1,
                    "OperationDate": "2013-11-02",
                    "TimingPointCode": "32001214",
                    "WheelChairAccessible": "ACCESSIBLE",
                    "LineName": "Den Haag Loosduinen - Zoetermeer Centrum-West vv.",
                    "LinePublicNumber": "3",
                    "LastUpdateTimeStamp": "2013-11-02T22:12:37",
                    "DestinationCode": "4",
                    "ExpectedDepartureTime": "2013-11-03T00:37:30",
                    "UserStopOrderNumber": 33,
                    "ProductFormulaType": "21",
                    "TimingPointName": "Zonnebloemstraat",
                    "LinePlanningNumber": "3",
                    "StopAreaCode": "1213",
                    "TimingPointDataOwnerCode": "ALGEMEEN",
                    "TimingPointTown": "Den Haag",
                    "TripStopStatus": "PLANNED",
                    "UserStopCode": "1214",
                    "JourneyStopType": "INTERMEDIATE",
                    "TargetArrivalTime": "2013-11-03T00:37:10",
                    "TargetDepartureTime": "2013-11-03T00:37:30",
                    "ExpectedArrivalTime": "2013-11-03T00:37:10"
                },
                "HTM_663051_3_39918_0": {
                    "IsTimingStop": false,
                    "DestinationName50": "Den Haag Loosduinen",
                    "DataOwnerCode": "HTM",
                    "FortifyOrderNumber": 0,
                    "TransportType": "TRAM",
                    "Longitude": 4.25565,
                    "Latitude": 52.07097,
                    "JourneyNumber": 39918,
                    "JourneyPatternCode": 44782,
                    "LocalServiceLevelCode": 663051,
                    "LineDirection": 1,
                    "OperationDate": "2013-11-02",
                    "TimingPointCode": "32001214",
                    "WheelChairAccessible": "ACCESSIBLE",
                    "LineName": "Den Haag Loosduinen - Zoetermeer Centrum-West vv.",
                    "LinePublicNumber": "3",
                    "LastUpdateTimeStamp": "2013-11-02T21:42:37",
                    "DestinationCode": "4",
                    "ExpectedDepartureTime": "2013-11-03T00:07:30",
                    "UserStopOrderNumber": 33,
                    "ProductFormulaType": "21",
                    "TimingPointName": "Zonnebloemstraat",
                    "LinePlanningNumber": "3",
                    "StopAreaCode": "1213",
                    "TimingPointDataOwnerCode": "ALGEMEEN",
                    "TimingPointTown": "Den Haag",
                    "TripStopStatus": "PLANNED",
                    "UserStopCode": "1214",
                    "JourneyStopType": "INTERMEDIATE",
                    "TargetArrivalTime": "2013-11-03T00:07:10",
                    "TargetDepartureTime": "2013-11-03T00:07:30",
                    "ExpectedArrivalTime": "2013-11-03T00:07:10"
                },
                "HTM_663051_3_39861_0": {
                    "IsTimingStop": false,
                    "DestinationName50": "Den Haag Loosduinen",
                    "DataOwnerCode": "HTM",
                    "FortifyOrderNumber": 0,
                    "TransportType": "TRAM",
                    "Longitude": 4.25565,
                    "Latitude": 52.07097,
                    "JourneyNumber": 39861,
                    "JourneyPatternCode": 44782,
                    "LocalServiceLevelCode": 663051,
                    "LineDirection": 1,
                    "OperationDate": "2013-11-02",
                    "TimingPointCode": "32001214",
                    "WheelChairAccessible": "ACCESSIBLE",
                    "LineName": "Den Haag Loosduinen - Zoetermeer Centrum-West vv.",
                    "LinePublicNumber": "3",
                    "LastUpdateTimeStamp": "2013-11-02T22:31:37",
                    "DestinationCode": "4",
                    "ExpectedDepartureTime": "2013-11-03T00:56:00",
                    "UserStopOrderNumber": 33,
                    "ProductFormulaType": "21",
                    "TimingPointName": "Zonnebloemstraat",
                    "LinePlanningNumber": "3",
                    "StopAreaCode": "1213",
                    "TimingPointDataOwnerCode": "ALGEMEEN",
                    "TimingPointTown": "Den Haag",
                    "TripStopStatus": "PLANNED",
                    "UserStopCode": "1214",
                    "JourneyStopType": "INTERMEDIATE",
                    "TargetArrivalTime": "2013-11-03T00:55:40",
                    "TargetDepartureTime": "2013-11-03T00:56:00",
                    "ExpectedArrivalTime": "2013-11-03T00:55:40"
                },

etc. etc. etc.


Deze string is best wel lang en ik wil dus per bijvoorbeeld de TargetDepartureTime hebben. Nu is dit met een json met vaste elementen niet zo moeilijk om te doen via JSON.NET, maar het is in dit geval zo dat het element(hoop dat ik het goed zeg) elke keer een andere naam heeft. De eerst heet bijvoorbeeld HTM_663051_3_39920_0, maar dit is niet altijd zo en dit kan steeds anders zijn. Dat geldt ook voor de hoger gelegen elementen. Alles onder HTM_663051_3_39920_0 heeft wel een vaste naam.

Wat ik wil doen is het volgende:
Json-string Deserializen in classes en vanuit die classes een lijst genereren van bijvoorbeeld alle TargetDepartureTime's.
Ik moet dus classes maken maar dat gaat lastig omdat ik dus de naam van het element niet heb.

Ik heb niet super veel ervaring met C# en daarom loop ik hier nu tegen aan. Iemand een idee hoe ik dit aan moet pakken?

Alvast bedankt voor je hulp :)

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
De persoon die dat formaat bedacht heeft verdient een nekschot, maar dat terzijde.

Ik weet niet of http://json.codeplex.com/ op windows phone gaat werken, maar daarmee kun je gewoon een json boom inlezen en er doorheen loopen. Dan kun je dus vrij simpel alle blokken met een TargetDepartureTime vinden door gewoon door de boom heen te itereren.

Docs: http://james.newtonking.com/json/help/index.html

https://niels.nu


  • Rhndy
  • Registratie: Februari 2010
  • Laatst online: 04-06 09:32
Hydra schreef op zondag 03 november 2013 @ 10:17:
De persoon die dat formaat bedacht heeft verdient een nekschot, maar dat terzijde.

Ik weet niet of http://json.codeplex.com/ op windows phone gaat werken, maar daarmee kun je gewoon een json boom inlezen en er doorheen loopen. Dan kun je dus vrij simpel alle blokken met een TargetDepartureTime vinden door gewoon door de boom heen te itereren.

Docs: http://james.newtonking.com/json/help/index.html
Eens wat betreft het eerste. Ik ben dus al bezig met Json.Net en de documentatie is redelijk straightforward en normaliter levert het ook geen problemen op. Maar in dit geval dus wel. Als ik bv. de TargetArrivalTime wil hebben van het eerste record dan kan ik die als volgt inladen:
C#:
1
2
JObject x = JObject.Parse (e.Result)
string TargetArrivalTime = (string)x["1213"]["32001214"]["Passes"]["HTM_663051_3_39920_0"]["TargetArrivalTime"]


Dat gaat prima... Enige feit is dat ik alleen die "1213" weet bij m'n request omdat de gebruiker dat als input geeft. Dus die "32001214" weet ik niet.
De JSON is als volgt opgebouwd:

Kortecode (bv.1213)
- Langecode (bv. 32001214)
--Passes
--- Ritcode (bv. HTM_663051_3_39920_0)
---- Data (bv. TargetArrivalTime)
-Langecode
--Passes
--- Ritcode
---- Data
etc. etc.

Wat ik dus van tevoren weet is de korte code en de data die ik wil hebben. Ik weet de lange code niet en i kweet de ritcode niet.
Ik wil uiteindelijk een lijst hebben van onder andere alle TargetArrivalTime's for alle Ritcodes en alle Langecodes.

Heb geprobeerd om via Regex de Ritcodes te veranderen maar dit was geen succes (ik weet absoluut niets van Regex af).
Idee hierachter was om alles tussen }, en : { te vervangen door "RIT" zodat ik alles normaal zou kunnen deserializen via classes.. Maar dit lijkt me ook nogal omslachtig...

Hoop dat ik het een beetje goed uitgelegd heb.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Zoals ik al zei: je moet dus zelf die boomstructuur doorzoeken. Ik ga dat niet helemaal voor je uitwerken, maar je kunt met een aantal geneste for-loops gewoon door die structuur itereren. Een JObject heeft een ChildrenTokens list, dat zijn de onderliggende objecten. Die hebben zelf elk weer een ChildrenTokens list. Begin eens met een for-loop de namen e.d. van de ChildrenTokens van je object x af te drukken.

https://niels.nu


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Hydra schreef op zondag 03 november 2013 @ 12:34:
Zoals ik al zei: je moet dus zelf die boomstructuur doorzoeken. Ik ga dat niet helemaal voor je uitwerken, maar je kunt met een aantal geneste for-loops gewoon door die structuur itereren. Een JObject heeft een ChildrenTokens list, dat zijn de onderliggende objecten. Die hebben zelf elk weer een ChildrenTokens list. Begin eens met een for-loop de namen e.d. van de ChildrenTokens van je object x af te drukken.
Het hoeft niet eens met een hele stapel lelijk geneste for loops.
Json.NET ondersteunt het schrijven van je eigen converter classes om tussen JSON en C# POCOs te converteren. Die converters kun je via [Attribute] notatie aan de classes van je object model hangen.