Mijn vraag
Om mijn Developer kennis weer een beetje up to date te brengen ben ik voor mezelf een tooltje aan het bouwen ter ondersteuning van een bordspel.
Het gaat om een bordspel waarbij ruimteschepen elkaar beschieten. De wapens hebben een tabel waarbij aan de hand van de afstand tot het doel en een dobbelsteenworp de schade wordt bepaald. Een wapen kan meerdere "Firing modes" hebben. Een wapen heeft dan ook verschillende firing modes die ieder afhankelijk van afstand en een dobbelsteenworp een getal aan schade hebben.
De data hiervoor heb ik in een JSON bestand staan. Het gaat om nogal een aantal verschillende wapens en firingmodes dus een bestand als input is gewenst (wellicht dat dat ooit nog refactored gaat worden naar een database table, voor het moment niet nodig).
De JSON ziet er ongeveer zo uit (alleen dan met een hele berg wapens en firing modes :-))
In PHP is het verwerken van die JSON eenvoudig. De JSON parser maakt er een mooie multilayered multidimensionele named array van. Ik zeg: Geef mij de array die onder "weapons" hangt en itereer daar doorheen. Itereer vervolgens over de array die onder "firing modes" hangt. etc.
Mijn zoektocht vertelt mij dat GSON the way to go is wanneer ik JSON wil verwerken in Java. GSON geeft mij de optie:
die iets soortgelijks zou moeten opleveren.
De grote uitdaging is dat Java iets kritischer is met types. Simpelweg zeggen "Geef mij alles wat onder "weapons" hangt" is dus geen optie; ik moet hem vertellen wat daar onder hangt. Het probleem is alleen dat de code helemaal niet weet wat er onder hangt aangezien dat pas vanuit de file mee komt.
Ik weet dus dat er een Map<String, Map> onder zal hangen maar ik kan niet zeggen:
omdat de entrySet slechts objecten terug geeft en geen Maps. Nou zou ik weaponsAsMap als Object kunnen definieren maar dan zal het in de volgende stap fout gaan.
Is er een betere manier om door een geïmporteerd JSON map heen te lopen? Of mischien zelfs een betere manier om überhaupt die JSON binnen te halen?
Het is één ding om googlefu of stackoverflowfu te gebruiken voor generieke zaken maar nergens iets te vinden over JSON die iets ingewikkelder in elkaar steekt :-D
Om mijn Developer kennis weer een beetje up to date te brengen ben ik voor mezelf een tooltje aan het bouwen ter ondersteuning van een bordspel.
Het gaat om een bordspel waarbij ruimteschepen elkaar beschieten. De wapens hebben een tabel waarbij aan de hand van de afstand tot het doel en een dobbelsteenworp de schade wordt bepaald. Een wapen kan meerdere "Firing modes" hebben. Een wapen heeft dan ook verschillende firing modes die ieder afhankelijk van afstand en een dobbelsteenworp een getal aan schade hebben.
De data hiervoor heb ik in een JSON bestand staan. Het gaat om nogal een aantal verschillende wapens en firingmodes dus een bestand als input is gewenst (wellicht dat dat ooit nog refactored gaat worden naar een database table, voor het moment niet nodig).
De JSON ziet er ongeveer zo uit (alleen dan met een hele berg wapens en firing modes :-))
code:
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
| { "weapons": [ { "name": "disruptor", "firing modes": [ { "name": "standard", "range table": [ ["0","0"], ["1","1"], ["2","2"], ["3","4"], ["5","15"], ["16","25"] ], "damage table": [ ["5", "5", "5", "5", "5", "5"], ["5", "5", "5", "5", "5", "0"], ["4", "4", "4", "4", "4", "0"], ["4", "4", "4", "4", "0", "0"], ["3", "3", "3", "3", "0", "0"], ["2", "2", "2", "0", "0", "0"] ] }, { "name": "overload", "range table": [ ["0","0"], ["1","1"], ["2","2"], ["3","4"], ["5","8"] ], "damage table": [ ["10", "10", "10", "10", "10", "10"], ["10", "10", "10", "10", "10", "0"], ["8", "8", "8", "8", "8", "0"], ["8", "8", "8", "8", "0", "0"], ["6", "6", "6", "6", "0", "0"] ] } ] } ] } |
In PHP is het verwerken van die JSON eenvoudig. De JSON parser maakt er een mooie multilayered multidimensionele named array van. Ik zeg: Geef mij de array die onder "weapons" hangt en itereer daar doorheen. Itereer vervolgens over de array die onder "firing modes" hangt. etc.
Mijn zoektocht vertelt mij dat GSON the way to go is wanneer ik JSON wil verwerken in Java. GSON geeft mij de optie:
code:
1
| Map map = gson.fromJson(jsonString, Map.class); |
die iets soortgelijks zou moeten opleveren.
De grote uitdaging is dat Java iets kritischer is met types. Simpelweg zeggen "Geef mij alles wat onder "weapons" hangt" is dus geen optie; ik moet hem vertellen wat daar onder hangt. Het probleem is alleen dat de code helemaal niet weet wat er onder hangt aangezien dat pas vanuit de file mee komt.
Ik weet dus dat er een Map<String, Map> onder zal hangen maar ik kan niet zeggen:
code:
1
| for (Map<String, Map> weaponAsMap : weaponsAsMap.entrySet()) { |
omdat de entrySet slechts objecten terug geeft en geen Maps. Nou zou ik weaponsAsMap als Object kunnen definieren maar dan zal het in de volgende stap fout gaan.
Is er een betere manier om door een geïmporteerd JSON map heen te lopen? Of mischien zelfs een betere manier om überhaupt die JSON binnen te halen?
Het is één ding om googlefu of stackoverflowfu te gebruiken voor generieke zaken maar nergens iets te vinden over JSON die iets ingewikkelder in elkaar steekt :-D