2017-12-31 113 views
0

Ich versuche, Json-Validierung für meine Rest API zu verwalten. Ich habe mich entschieden, das github.com/xeipuuv/gojsonschema Paket zu implementieren.laden mehrere gojsonschemas für die spätere Verwendung

Oben funktioniert gut, aber ich bin nicht glücklich, denn für jede API-Anfrage muss das Schema geladen werden.

Also in meinem App-Setup möchte ich alle Schemas in eine Karte von Schemas für die spätere Verwendung laden.

package schemas 

import (
    "os" 
    "path/filepath" 
    "strings" 

    "github.com/xeipuuv/gojsonschema" 
) 

const ext = ".json" 

func LoadSchemas() error { 
    pathS, err := os.Getwd() 
    if err != nil { 
     return err 
    } 

    var files = make(map[string]*gojsonschema.jsonReferenceLoader) // This is where I am stuck... 
    filepath.Walk(pathS+"/schemas", func(path string, f os.FileInfo, _ error) error { 
     if !f.IsDir() { 
      if filepath.Ext(path) == ext { 
       key := strings.TrimRight(f.Name(), ext) 
       files[key] = gojsonschema.NewReferenceLoader("file://" + path) 
      } 
     } 
     return nil 
    }) 

    return nil 
} 

gojsonschema.NewReferenceLoader("file://" + path) kehrt *jsonReferenceLoader - jsonReferenceLoader außerhalb des Pakets nicht exportiert wird.

// NewReferenceLoader returns a JSON reference loader using the given source and the local OS file system. 
func NewReferenceLoader(source string) *jsonReferenceLoader { 
    return &jsonReferenceLoader{ 
     fs:  osFS, 
     source: source, 
    } 
} 

Alle Hinweise/Tipps zur Lösung des oben genannten Problems?

+1

jsonReferenceLoader implementiert die Schnittstelle [JSONLoader] (https://godoc.org/github.com/xeipuuv/gojsonschema#JSONLoader), dass alle sollten Sie brauchen damit zu interagieren. – Marc

+0

@Marc - Könnten Sie Beispiel in einer Antwort angeben und ich kann das als Antwort bitte akzeptieren? – Gravy

Antwort

1

Von @ Marcs Antwort, würden Sie nur die stattdessen JSONLoader Schnittstelle verwenden:

var files = make(map[string]gojsonschema.JSONLoader) 

In Go, jede Variable/Typ/Funktion/etc. das beginnt mit einem Kleinbuchstaben ist "privat" und daher außerhalb dieses Pakets nicht sichtbar. Da Ihr Code nicht Teil des gojsonschema-Pakets ist, können Sie nicht auf diesen Typ zugreifen.

Hier ist ein Beispiel in der Go Tour: https://tour.golang.org/basics/3

Verwandte Themen