json - 根据 JSON 模式验证结构

标签 json go jsonschema

我正在尝试编写一个函数,将编码结构接收为 []byte 并根据 json 模式进行验证。

type Person struct {
    ID        string   `json:"id,omitempty" xml:"id,attr"`
    Firstname string   `json:"firstname,omitempty" xml:"name>first" `
    Lastname  string   `json:"lastname,omitempty" xml:"name>last"`
    Address   *Address `json:"address,omitempty"`
}

//JSONPerson parses a person struct to a byte array
func JSONPerson(person []Person) []byte {
    var complete []byte
    for _, item := range person {
        output, err := json.Marshal(item)
        if err != nil {
            fmt.Printf("Error: %v\n", err)
        }
        complete = append(complete, output...)
    }
    return complete
}

func ValidateByte(person []byte) {
    //Loads the schema
    schema, err := jsonschema.Compile("Schemas/test.json")
    if err != nil {
        panic(err)
    }
    reader := bytes.NewReader(person)
    if err = schema.Validate(reader); err != nil {
        panic(err)
    } else {
        fmt.Println("Works fine")
    }
}

执行时出现此错误 http: panic serving [::1]:50664: invalid character { after top-level value.

我已经针对包含数据的 json 文件再次测试了架构。但无法针对结构验证它。

我正在使用 github.com/santhosh-tekuri/jsonschema

最佳答案

让我们测试一个简化版本的 JSONPerson 函数。

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    ID   string `json:"id,omitempty"`
    Name string `json:"name,omitempty"`
}

func JSONPerson(person []Person) []byte {
    var complete []byte
    for _, item := range person {
        output, err := json.Marshal(item)
        if err != nil {
            fmt.Printf("Error: %v\n", err)
        }
        complete = append(complete, output...)
    }
    return complete
}

func main() {
    person := []Person{
        Person{"id1", "name1"},
        Person{"id2", "name2"},
    }
    fmt.Println(string(JSONPerson(person)))
}

输出是:

{"id":"id1","name":"name1"}{"id":"id2","name":"name2"}

您在架构验证期间看到的错误,“无效字符 { 在顶级值之后”,指的是第二个 {,它使此输入无效 JSON。

JSONPerson 旨在输出一个 JSON 数组,因此您需要确保输出包含在 [brackets] 中并且在那里是数组元素之间的逗号。

[{"id":"id1","name":"name1"},{"id":"id2","name":"name2"}]

关于json - 根据 JSON 模式验证结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48956201/

相关文章:

jquery - IE8 版本 8.0.7600 及更低版本中的 JSON 基元无效

json - 如何使用 Jackson API(列表中的列表)迭代 JSON 响应?

go - 避免检查错误是否是零重复?

go - 如何在 Go 结构体标签内转义反引号

json - "required"JSON 模式中的关键字

Json 架构未验证必需的属性

json - 从 Spark 2.3 开始,当引用的列仅包含内部损坏的记录列时,不允许从原始 JSON/CSV 文件进行查询

javascript - 通过 onclick 事件将 json 编码的多维数组传递给 javascript

go - 如何解决与此错误消息的冲突?

java - 带有任何字段到 POJO 的 Json 模式