github.com/gogf/gf/v2@v2.7.4/encoding/gjson/gjson_z_unit_feature_load_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package gjson_test
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/gogf/gf/v2/encoding/gjson"
    13  	"github.com/gogf/gf/v2/frame/g"
    14  	"github.com/gogf/gf/v2/os/gfile"
    15  	"github.com/gogf/gf/v2/test/gtest"
    16  )
    17  
    18  func Test_Load_JSON1(t *testing.T) {
    19  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    20  	// JSON
    21  	gtest.C(t, func(t *gtest.T) {
    22  		j, err := gjson.LoadContent(data)
    23  		t.AssertNil(err)
    24  		t.Assert(j.Get("n").String(), "123456789")
    25  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
    26  		t.Assert(j.Get("m.k").String(), "v")
    27  		t.Assert(j.Get("a").Slice(), g.Slice{1, 2, 3})
    28  		t.Assert(j.Get("a.1").Int(), 2)
    29  	})
    30  	// JSON
    31  	gtest.C(t, func(t *gtest.T) {
    32  		errData := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]`)
    33  		_, err := gjson.LoadContentType("json", errData, true)
    34  		t.AssertNE(err, nil)
    35  	})
    36  	// JSON
    37  	gtest.C(t, func(t *gtest.T) {
    38  		path := "test.json"
    39  		gfile.PutBytes(path, data)
    40  		defer gfile.Remove(path)
    41  		j, err := gjson.Load(path, true)
    42  		t.AssertNil(err)
    43  		t.Assert(j.Get("n").String(), "123456789")
    44  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
    45  		t.Assert(j.Get("m.k").String(), "v")
    46  		t.Assert(j.Get("a").Slice(), g.Slice{1, 2, 3})
    47  		t.Assert(j.Get("a.1").Int(), 2)
    48  	})
    49  }
    50  
    51  func Test_Load_JSON2(t *testing.T) {
    52  	data := []byte(`{"n":123456789000000000000, "m":{"k":"v"}, "a":[1,2,3]}`)
    53  	gtest.C(t, func(t *gtest.T) {
    54  		j, err := gjson.LoadContent(data)
    55  		t.AssertNil(err)
    56  		t.Assert(j.Get("n").String(), "123456789000000000000")
    57  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
    58  		t.Assert(j.Get("m.k").String(), "v")
    59  		t.Assert(j.Get("a").Slice(), g.Slice{1, 2, 3})
    60  		t.Assert(j.Get("a.1").Int(), 2)
    61  	})
    62  }
    63  
    64  func Test_Load_XML(t *testing.T) {
    65  	data := []byte(`<doc><a>1</a><a>2</a><a>3</a><m><k>v</k></m><n>123456789</n></doc>`)
    66  	// XML
    67  	gtest.C(t, func(t *gtest.T) {
    68  		j, err := gjson.LoadContent(data)
    69  		t.AssertNil(err)
    70  		t.Assert(j.Get("doc.n").String(), "123456789")
    71  		t.Assert(j.Get("doc.m").Map(), g.Map{"k": "v"})
    72  		t.Assert(j.Get("doc.m.k").String(), "v")
    73  		t.Assert(j.Get("doc.a").Slice(), g.Slice{"1", "2", "3"})
    74  		t.Assert(j.Get("doc.a.1").Int(), 2)
    75  	})
    76  	// XML
    77  	gtest.C(t, func(t *gtest.T) {
    78  		j, err := gjson.LoadXml(data, true)
    79  		t.AssertNil(err)
    80  		t.Assert(j.Get("doc.n").String(), "123456789")
    81  		t.Assert(j.Get("doc.m").Map(), g.Map{"k": "v"})
    82  		t.Assert(j.Get("doc.m.k").String(), "v")
    83  		t.Assert(j.Get("doc.a").Slice(), g.Slice{"1", "2", "3"})
    84  		t.Assert(j.Get("doc.a.1").Int(), 2)
    85  	})
    86  	// XML
    87  	gtest.C(t, func(t *gtest.T) {
    88  		errData := []byte(`<doc><a>1</a><a>2</a><a>3</a><m><k>v</k></m><n>123456789</n><doc>`)
    89  		_, err := gjson.LoadContentType("xml", errData, true)
    90  		t.AssertNE(err, nil)
    91  	})
    92  	// XML
    93  	gtest.C(t, func(t *gtest.T) {
    94  		path := "test.xml"
    95  		gfile.PutBytes(path, data)
    96  		defer gfile.Remove(path)
    97  		j, err := gjson.Load(path)
    98  		t.AssertNil(err)
    99  		t.Assert(j.Get("doc.n").String(), "123456789")
   100  		t.Assert(j.Get("doc.m").Map(), g.Map{"k": "v"})
   101  		t.Assert(j.Get("doc.m.k").String(), "v")
   102  		t.Assert(j.Get("doc.a").Array(), g.Slice{"1", "2", "3"})
   103  		t.Assert(j.Get("doc.a.1").Int(), 2)
   104  	})
   105  
   106  	// XML
   107  	gtest.C(t, func(t *gtest.T) {
   108  		xml := `<?xml version="1.0"?>
   109  
   110  	<Output type="o">
   111  	<itotalSize>0</itotalSize>
   112  	<ipageSize>1</ipageSize>
   113  	<ipageIndex>2</ipageIndex>
   114  	<itotalRecords>GF框架</itotalRecords>
   115  	<nworkOrderDtos/>
   116  	<nworkOrderFrontXML/>
   117  	</Output>`
   118  		j, err := gjson.LoadContent(xml)
   119  		t.AssertNil(err)
   120  		t.Assert(j.Get("Output.ipageIndex"), "2")
   121  		t.Assert(j.Get("Output.itotalRecords"), "GF框架")
   122  	})
   123  }
   124  
   125  func Test_Load_YAML1(t *testing.T) {
   126  	data := []byte(`
   127  a:
   128  - 1
   129  - 2
   130  - 3
   131  m:
   132   k: v
   133  "n": 123456789
   134      `)
   135  	// YAML
   136  	gtest.C(t, func(t *gtest.T) {
   137  		j, err := gjson.LoadContent(data)
   138  		t.AssertNil(err)
   139  		t.Assert(j.Get("n").String(), "123456789")
   140  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   141  		t.Assert(j.Get("m.k").String(), "v")
   142  		t.Assert(j.Get("a").Slice(), g.Slice{1, 2, 3})
   143  		t.Assert(j.Get("a.1").Int(), 2)
   144  	})
   145  	// YAML
   146  	gtest.C(t, func(t *gtest.T) {
   147  		j, err := gjson.LoadYaml(data, true)
   148  		t.AssertNil(err)
   149  		t.Assert(j.Get("n").String(), "123456789")
   150  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   151  		t.Assert(j.Get("m.k").String(), "v")
   152  		t.Assert(j.Get("a").Slice(), g.Slice{1, 2, 3})
   153  		t.Assert(j.Get("a.1").Int(), 2)
   154  	})
   155  	// YAML
   156  	gtest.C(t, func(t *gtest.T) {
   157  		path := "test.yaml"
   158  		gfile.PutBytes(path, data)
   159  		defer gfile.Remove(path)
   160  		j, err := gjson.Load(path)
   161  		t.AssertNil(err)
   162  		t.Assert(j.Get("n").String(), "123456789")
   163  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   164  		t.Assert(j.Get("m.k").String(), "v")
   165  		t.Assert(j.Get("a").Slice(), g.Slice{1, 2, 3})
   166  		t.Assert(j.Get("a.1").Int(), 2)
   167  	})
   168  }
   169  
   170  func Test_Load_YAML2(t *testing.T) {
   171  	data := []byte("i : 123456789")
   172  	gtest.C(t, func(t *gtest.T) {
   173  		j, err := gjson.LoadContent(data)
   174  		t.AssertNil(err)
   175  		t.Assert(j.Get("i"), "123456789")
   176  	})
   177  	gtest.C(t, func(t *gtest.T) {
   178  		errData := []byte("i # 123456789")
   179  		_, err := gjson.LoadContentType("yaml", errData, true)
   180  		t.AssertNE(err, nil)
   181  	})
   182  }
   183  
   184  func Test_Load_TOML1(t *testing.T) {
   185  	data := []byte(`
   186  a = ["1", "2", "3"]
   187  n = 123456789
   188  
   189  [m]
   190    k = "v"
   191  `)
   192  	// TOML
   193  	gtest.C(t, func(t *gtest.T) {
   194  		j, err := gjson.LoadContent(data)
   195  		t.AssertNil(err)
   196  		t.Assert(j.Get("n").String(), "123456789")
   197  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   198  		t.Assert(j.Get("m.k").String(), "v")
   199  		t.Assert(j.Get("a").Slice(), g.Slice{"1", "2", "3"})
   200  		t.Assert(j.Get("a.1").Int(), 2)
   201  	})
   202  	// TOML
   203  	gtest.C(t, func(t *gtest.T) {
   204  		j, err := gjson.LoadToml(data, true)
   205  		t.AssertNil(err)
   206  		t.Assert(j.Get("n").String(), "123456789")
   207  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   208  		t.Assert(j.Get("m.k").String(), "v")
   209  		t.Assert(j.Get("a").Slice(), g.Slice{"1", "2", "3"})
   210  		t.Assert(j.Get("a.1").Int(), 2)
   211  	})
   212  	// TOML
   213  	gtest.C(t, func(t *gtest.T) {
   214  		path := "test.toml"
   215  		gfile.PutBytes(path, data)
   216  		defer gfile.Remove(path)
   217  		j, err := gjson.Load(path)
   218  		t.AssertNil(err)
   219  		t.Assert(j.Get("n").String(), "123456789")
   220  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   221  		t.Assert(j.Get("m.k").String(), "v")
   222  		t.Assert(j.Get("a").Slice(), g.Slice{"1", "2", "3"})
   223  		t.Assert(j.Get("a.1").Int(), 2)
   224  	})
   225  }
   226  
   227  func Test_Load_TOML2(t *testing.T) {
   228  	data := []byte("i=123456789")
   229  	gtest.C(t, func(t *gtest.T) {
   230  		j, err := gjson.LoadContent(data)
   231  		t.AssertNil(err)
   232  		t.Assert(j.Get("i"), "123456789")
   233  	})
   234  	gtest.C(t, func(t *gtest.T) {
   235  		errData := []byte("i : 123456789")
   236  		_, err := gjson.LoadContentType("toml", errData, true)
   237  		t.AssertNE(err, nil)
   238  	})
   239  }
   240  
   241  func Test_Load_Basic(t *testing.T) {
   242  	gtest.C(t, func(t *gtest.T) {
   243  		j := gjson.New(nil)
   244  		t.Assert(j.Interface(), nil)
   245  		_, err := gjson.Decode(nil)
   246  		t.AssertNE(err, nil)
   247  		_, err = gjson.DecodeToJson(nil)
   248  		t.AssertNE(err, nil)
   249  		j, err = gjson.LoadContent(nil)
   250  		t.AssertNil(err)
   251  		t.Assert(j.Interface(), nil)
   252  
   253  		j, err = gjson.LoadContent(`{"name": "gf"}`)
   254  		t.AssertNil(err)
   255  
   256  		j, err = gjson.LoadContent(`{"name": "gf"""}`)
   257  		t.AssertNE(err, nil)
   258  
   259  		j = gjson.New(&g.Map{"name": "gf"})
   260  		t.Assert(j.Get("name").String(), "gf")
   261  
   262  	})
   263  }
   264  
   265  func Test_Load_Ini(t *testing.T) {
   266  	var data = `
   267  
   268  ;注释
   269  
   270  [addr]
   271  ip = 127.0.0.1
   272  port=9001
   273  enable=true
   274  
   275  	[DBINFO]
   276  	type=mysql
   277  	user=root
   278  	password=password
   279  
   280  `
   281  
   282  	gtest.C(t, func(t *gtest.T) {
   283  		j, err := gjson.LoadContent(data)
   284  		if err != nil {
   285  			gtest.Fatal(err)
   286  		}
   287  
   288  		t.Assert(j.Get("addr.ip").String(), "127.0.0.1")
   289  		t.Assert(j.Get("addr.port").String(), "9001")
   290  		t.Assert(j.Get("addr.enable").String(), "true")
   291  		t.Assert(j.Get("DBINFO.type").String(), "mysql")
   292  		t.Assert(j.Get("DBINFO.user").String(), "root")
   293  		t.Assert(j.Get("DBINFO.password").String(), "password")
   294  
   295  		_, err = j.ToIni()
   296  		if err != nil {
   297  			gtest.Fatal(err)
   298  		}
   299  	})
   300  
   301  	gtest.C(t, func(t *gtest.T) {
   302  		j, err := gjson.LoadIni(data, true)
   303  		if err != nil {
   304  			gtest.Fatal(err)
   305  		}
   306  
   307  		t.Assert(j.Get("addr.ip").String(), "127.0.0.1")
   308  		t.Assert(j.Get("addr.port").String(), "9001")
   309  		t.Assert(j.Get("addr.enable").String(), "true")
   310  		t.Assert(j.Get("DBINFO.type").String(), "mysql")
   311  		t.Assert(j.Get("DBINFO.user").String(), "root")
   312  		t.Assert(j.Get("DBINFO.password").String(), "password")
   313  	})
   314  
   315  	gtest.C(t, func(t *gtest.T) {
   316  		errData := []byte("i : 123456789")
   317  		_, err := gjson.LoadContentType("ini", errData, true)
   318  		t.AssertNE(err, nil)
   319  	})
   320  }
   321  
   322  func Test_Load_YamlWithV3(t *testing.T) {
   323  	content := `
   324  # CLI tool, only in development environment.
   325  # https://goframe.org/pages/viewpage.action?pageId=3673173
   326  gfcli:
   327    gen:
   328      dao:
   329      - path            : "../../pkg/oss/oss/internal"
   330        group           : "oss"
   331        stdTime         : true
   332        descriptionTag  : true
   333        noJsonTag       : true
   334        noModelComment  : true
   335        overwriteDao    : true
   336        modelFileForDao : "model_dao.go"
   337        tablesEx        : |
   338          bpmn_info,
   339          dlocker,
   340          dlocker_detail,
   341          message_table,
   342          monitor_data,
   343          resource_param_info,
   344          version_info,
   345          version_topology_info,
   346          work_flow,
   347          work_flow_step_info,
   348          work_flow_undo_step_info
   349  
   350      - path            : "../../pkg/oss/workflow/internal"
   351        group           : "workflow"
   352        stdTime         : true
   353        descriptionTag  : true
   354        noJsonTag       : true
   355        noModelComment  : true
   356        overwriteDao    : true
   357        modelFileForDao : "model_dao.go"
   358  `
   359  	gtest.C(t, func(t *gtest.T) {
   360  		_, err := gjson.LoadContent(content)
   361  		t.AssertNil(err)
   362  	})
   363  }
   364  
   365  func Test_Load_Properties(t *testing.T) {
   366  	var data = `
   367  
   368  #注释
   369  
   370  
   371  addr.ip = 127.0.0.1
   372  addr.port=9001
   373  addr.enable=true
   374  DBINFO.type=mysql
   375  DBINFO.user=root
   376  DBINFO.password=password
   377  
   378  `
   379  
   380  	gtest.C(t, func(t *gtest.T) {
   381  		j, err := gjson.LoadContent(data)
   382  		if err != nil {
   383  			gtest.Fatal(err)
   384  		}
   385  
   386  		t.Assert(j.Get("addr.ip").String(), "127.0.0.1")
   387  		t.Assert(j.Get("addr.port").String(), "9001")
   388  		t.Assert(j.Get("addr.enable").String(), "true")
   389  		t.Assert(j.Get("DBINFO.type").String(), "mysql")
   390  		t.Assert(j.Get("DBINFO.user").String(), "root")
   391  		t.Assert(j.Get("DBINFO.password").String(), "password")
   392  
   393  		_, err = j.ToProperties()
   394  		if err != nil {
   395  			gtest.Fatal(err)
   396  		}
   397  	})
   398  
   399  	gtest.C(t, func(t *gtest.T) {
   400  		j, err := gjson.LoadProperties(data, true)
   401  		if err != nil {
   402  			gtest.Fatal(err)
   403  		}
   404  
   405  		t.Assert(j.Get("addr.ip").String(), "127.0.0.1")
   406  		t.Assert(j.Get("addr.port").String(), "9001")
   407  		t.Assert(j.Get("addr.enable").String(), "true")
   408  		t.Assert(j.Get("DBINFO.type").String(), "mysql")
   409  		t.Assert(j.Get("DBINFO.user").String(), "root")
   410  		t.Assert(j.Get("DBINFO.password").String(), "password")
   411  	})
   412  
   413  	gtest.C(t, func(t *gtest.T) {
   414  		errData := []byte("i\\u1 : 123456789")
   415  		_, err := gjson.LoadContentType("properties", errData, true)
   416  		t.AssertNE(err, nil)
   417  	})
   418  }