当前位置: 首页 > 工具软件 > JSON for .NET > 使用案例 >

Jsonnet说明

桓高澹
2023-12-01

什么是Jsonnet

Jsonnet是Google开源的一门配置语言,用于弥补JSON所暴露的短板,它完全兼容JSON,并加入了JSON所没有的一些特性,包括注释、引用、算数运算、条件操作符、数组和对象深入、引入函数、局部变量、继承等,Jsonnet程序被编译为兼容JSON的数据格式。简单来说Jsonnet就是增强版JSON。

JSON的应用场景跟缺陷

JSON是一种轻量级的数据交换格式,是基于ECMAScript的一个子集,采用完全独立于语言的文本格式,同时也是用了类C的习惯,JSON在各语言间支持友好,可读性强,数据性能比XML好,所以JSON成为目前非常广泛的数据交换格式。

  • 使用场景
    • 前后端数据交互
    • 各语言之间的数据交互
    • 应用的配置文件
  • 缺陷
    • 不能加注释
    • 对象或数组最后一项后面不能有逗号
    • 不支持变量、函数
    • 不能用算数和逻辑运算
    • 不能划分,复用,文件隔离
    • key必须加双引号
    • value为字符时必须用双引号
      Jsonnet对这些缺陷做了弥补,key的双引号不是必须,对象和数组最后一个属性可以有逗号,支持注释,支持算数运算等等。

Jsonnet功能

  • 注释
    Jsonnet支持单行或多行注释

    /* This is demo comment*/
    { //This comment show for test
        key1:{
            "tom":[
                {kind:"man",test:1.0},
            ]
        }
    }
    
  • 引用

    Jsonnet中可以通过self引用当前对象,$引用根对象

    {
        test:{
            data:"data1",
            data2: self.data
        },
        test1:{
            data:$.test.data
        }
    }
    
  • 数据操作

    支持逻辑运算与算数运算

    {
        foo:4,
        bar: 2*self.foo,
        bar2:"this value is "+ self.bar+"."
        arrays:[1,2,3]+[4,5]//拼接
        equal: 1== 2
    }
    
  • 数组和对象深入

    {
        foo:[1,2,3],
        bar:[x*x for x in self.foo if x>=2],
        bar2:{["field"+x]: x for x in self.foo},
        obj:{["foo"+"bar"]:3},
    }
    
  • 模块化

    Jsonnet文件可进行拆分,拆分成多个小文件,每个文件里又是一个Jsonnet对象,通过import进行引入使用

  • 函数与变量

    //函数demo
    {
        qual_demo(size,value)::
        	if std.length(value) == 0 then
        		error "no data"
        	else [
                {kind: i,data: size/std.length(value)}
                for i in value
        	]
        id:: function(x) x,
    }
    
    //变量demo
    {
        local my_data = "data",
        data:{
            demo:my_data
        }
    }
    
  • 面向对象继承

    {
        demo:{
            data:"data1",
        },
        demo2: self["demo"]+{
            data2:"hello"
        }
    }
    

总结

Jsonnet加入了注释,等功能,拥有了语言的特性,制造模拟数据时更加高效方便,但是Jsonnet无法再web场景下作为直接的数据交换格式,并且比较小众,使用场景相对较少,标准库也不够完善,也变得更为复杂


感谢阅读这份文档

 类似资料: