草庐IT

json - 根据 JSON 模式验证结构

coder 2024-07-09 原文

我正在尝试编写一个函数,将编码结构接收为 []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/

有关json - 根据 JSON 模式验证结构的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  7. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  8. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  9. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  10. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

随机推荐