2017-05-10 5 views
0

Ich mag diese JSON beschreiben:

{ 
    "key1": {}, 
    "key2": {} 
} 

so habe ich dieses JSON Schema:

{ 
    "type": "object", 
    "patternProperties": { 
    ".+": { 
     "type": "object" 
    } 
    } 
} 

Das Problem ist, dass, wenn ich einen $schema Link zu der JSON hinzuzufügen, ist es nicht gültig ist:

JSON schema error

Erstens scheint es seltsam, dass $schema jede Art von Sonder tre benötigen würde atment aber auch wenn ich versuche, dies:

{ 
    "type": "object", 
    "properties": { 
    "$schema": { 
     "type": "string" 
    } 
    }, 
    "patternProperties": { 
    ".+": { 
     "type": "object" 
    } 
    } 
} 

nicht festgelegt ist:

err

, ein paar Schemata scheinen http://schemastore.org/json/ und sie keine spezielle Behandlung Ich bin gerade zu haben $schema. Wie funktioniert es?

Antwort

1

Das Schlüsselwort $ schema wird verwendet, um zu deklarieren, dass ein JSON-Fragment tatsächlich ein Stück von JSON-Schema ist. Aber es wird nicht in Ihrem JSON verwendet, wenn es kein Schema ist, d. H. Es wird nicht in Ihren JSON-Daten verwendet.

Anschließend verwenden Sie einen Validator, um das Schema mit den JSON-Daten abzugleichen. Zum Beispiel können Sie this validator verwenden. Auf der linken Seite geben Sie das Schema an, in dem Sie JSON-Daten angeben (ohne Verweis oder Verknüpfung zum Schema, verwenden Sie nicht das $ schema-Schlüsselwort auf der rechten Seite)

Das Schlüsselwort $ schema gibt an, welche Version von der JSON-Schema-Standard, für den das Schema gilt (wiederum das JSON-Schema, nicht die JSON-Daten). Die meiste Zeit ist:

"$schema": "http://json-schema.org/draft-04/schema#" 

Mehr Infos here

+0

Interessant, ist diese Methode von VSCode nicht-Standard verwendet? https://code.visualstudio.com/docs/languages/json#_mapping-in-the-json – Borek

+0

es scheint so ja – Pedro

+0

Ich habe ein Ticket in VSCode geöffnet: https://github.com/Microsoft/vscode/ Ausgaben/26407 – Borek

1

Die akzeptierte Antwort richtig ist, aber hier ist die Abhilfe Sie benötigen.

{ 
    "type": "object", 
    "properties": { 
    "$schema": { 
     "type": "string" 
    } 
    }, 
    "additionalProperties": { 
    "type": "object" 
    } 
} 

additionalProperites gilt nur für die Eigenschaften, die in properties definiert sind. patternProperties gilt dagegen für jede Eigenschaft, mit der es übereinstimmt. Die Art und Weise, wie Sie es mit patternProperties geschrieben haben bedeutet, dass "$ Schema" muss eine Zeichenfolge sein und es muss ein Objekt sein. Da diese beiden Dinge niemals beide wahr sein können, wird "$ schema" niemals mit irgendeinem Wert validiert.

+0

Danke, das ist sehr nützlich. Im Endeffekt glaube ich nicht wirklich, dass das Hinzufügen von '$ schema' zum JSON selbst richtig ist, es könnte auch das Laufzeitverhalten beeinflussen, an das ich vorher nicht gedacht habe, daher habe ich andere Möglichkeiten gefunden, das Schema JSON zuzuordnen in VSCode und öffnete dieses Problem: https://github.com/Microsoft/vscode/issues/26407 – Borek

+0

Es ist nur falsch, wenn Sie es als ein eingebautes Schlüsselwort und nicht als Teil Ihres Datenmodells behandeln. Es ist sicherlich keine schlechte Sache, wenn ein Dokument sich selbst beschreibt. VSCode hat einen Weg gefunden, dies zu tun, und das ist in Ordnung, solange sie diese Entscheidungsprogrammierer nicht aufzwingen.Ich nehme an, dass das nicht der Fall ist, da Sie gesagt haben, dass Sie einen Workaround gefunden haben, mit dem Sie sich wohl fühlen. – Jason

Verwandte Themen