Toon posts:

JSON-schema

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste,

Ik zit met een JSON-schema probleempje.
Ik heb bijvoorbeeld in JSON een aantal pages:

"pages": [
{
"id": "home-simple-1",
"name": "Home"
},
{
"id": "home-simple-2",
"name": "Home"
},
{
"id": "random-iets-anders",
"name": "Home"
}
]

Nu wil ik zo instellen, dat alle pages (dus de items) uit "pages" voldoen aan:

"id": {
"type": "string",
"pattern": "^[a-z0-9-]+$",
"description": "Het unieke page-id die een page-template onderscheid."
},

(Dat werkt overigens al).
Echter wil ik ook valideren dat er altijd 2 pages in de JSON zitten met page-id: "home-simple-1" en "home-simple-2". Deze 2 pages moeten namelijk altijd present zijn.

Ik kan met een pattern instellen dat een id gelijk is aan "home-simple-1" of zelf "home-simple-2". Dit doe ik met AnyOf of OneOf. Maar als ik GEEN pages opneem met "home-simple-1" of "home-simple-2", dan valideert deze dus ook..

Weet iemand de juiste manier hiervoor?

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Gewoon iets met
code:
1
2
3
for i = 0; i < pages.length; ++i
   if ('home-simple-1' == pages[i].id) { /* doe iets */ }
   if ('home-simple-2' == pages[i].id) { /* doe iets */ }

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 00:01

CyBeRSPiN

sinds 2001

Al naar http://swagger.io/ gekeken?

Acties:
  • +3 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

DJMaze schreef op maandag 5 december 2016 @ 17:32:
Gewoon iets met
code:
1
2
3
for i = 0; i < pages.length; ++i
   if ('home-simple-1' == pages[i].id) { /* doe iets */ }
   if ('home-simple-2' == pages[i].id) { /* doe iets */ }
Waarmee je dus het hele nut van schemavalidatie omzeilt.
Wat zou Swagger hier precies voor TS kunnen betekenen, en waarom link je dan naar de homepagina?


TS, je bent op zoek naar "allOf". Hiermee definieer je meerdere schema's die je op één property kunt toepassen.

Zie het volgende schema:

JavaScript:
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
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "definitions": {
    "page": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name"
      ]
    }
  },
  "properties": {
    "pages": {
      "allOf": [
        {
          "type": "array",
          "items": [
            {
              "type": "object",
              "properties": {
                "id": {
                  "enum": [
                    "home-simple-1"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "id": {
                  "enum": [
                    "home-simple-2"
                  ]
                }
              }
            }
          ],
          "additionalItems": true
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/page"
          }
        }
      ]
    }
  }
}


Je ziet eerst de definitie van een "page", gevolgd door het daadwerkelijke schema. Hierin worden er twee validaties over de pages-property gehaald:

• Tuple validation:
• • Het eerste element moet een id-property hebben met de waarde "home-simple-1"
• • Het tweede element moet een id-property hebben met de waarde "home-simple-2"
• • Hierna mogen nog meer elementen volgen
• List validation:
• • Ieder item in deze array moet voldoen aan de definitie van het page-object.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks! Dit is precies wat ik zocht!

Ik ga het morgen even implementeren, feedback stuur ik dan morgen.

Wat betreft de if statements, ja dit kan. Maar dan valt het schema validatatie principe gewoon weg zoals al aangegeven.

Swagger io is helaas ook niet wat ik zocht.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het werkt!! Thanks :)

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
CodeCaster schreef op maandag 5 december 2016 @ 18:16:
TS, je bent op zoek naar "allOf". Hiermee definieer je meerdere schema's die je op één property kunt toepassen.
Welke functie / library / framework gebruik je om te controleren of een instance inderdaad aan het schema voldoet?

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 23:00
Olaf van der Spek schreef op woensdag 7 december 2016 @ 14:48:
[...]

Welke functie / library / framework gebruik je om te controleren of een instance inderdaad aan het schema voldoet?
In PHP kan je deze gebruiken bijvoorbeeld: http://json-guard.thephpleague.com

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Olaf van der Spek schreef op woensdag 7 december 2016 @ 14:48:
[...]

Welke functie / library / framework gebruik je om te controleren of een instance inderdaad aan het schema voldoet?
Hangt van het framework af. Voor .NET is er van de welbekende James Newton-King (Newtonsoft.Json, de de facto JSON-library) het package "Newtonsoft.Json.Schema". Bovenstaand schema heb ik online gebouwd en gevalideerd via http://www.jsonschemavalidator.net/.

[ Voor 3% gewijzigd door CodeCaster op 07-12-2016 18:59 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Maar dan heb ik slechts schema validatie.. is het niet beter de API op een hoger niveau te testen?
Ik kwam https://github.com/apigee-127/swagger-test-templates tegen maar weet niet of dat de beste optie is.
Pagina: 1