gitee.com/quant1x/gox@v1.7.6/fastjson/parser_test.go (about)

     1  package fastjson
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  func TestParseRawNumber(t *testing.T) {
    12  	t.Run("success", func(t *testing.T) {
    13  		f := func(s, expectedRN, expectedTail string) {
    14  			t.Helper()
    15  
    16  			rn, tail, err := parseRawNumber(s)
    17  			if err != nil {
    18  				t.Fatalf("unexpected error: %s", err)
    19  			}
    20  			if rn != expectedRN {
    21  				t.Fatalf("unexpected raw number; got %q; want %q", rn, expectedRN)
    22  			}
    23  			if tail != expectedTail {
    24  				t.Fatalf("unexpected tail; got %q; want %q", tail, expectedTail)
    25  			}
    26  		}
    27  
    28  		f("0", "0", "")
    29  		f("0tail", "0", "tail")
    30  		f("123", "123", "")
    31  		f("123tail", "123", "tail")
    32  		f("-123tail", "-123", "tail")
    33  		f("-12.345tail", "-12.345", "tail")
    34  		f("-12.345e67tail", "-12.345e67", "tail")
    35  		f("-12.345E+67 tail", "-12.345E+67", " tail")
    36  		f("-12.345E-67,tail", "-12.345E-67", ",tail")
    37  		f("-1234567.8e+90tail", "-1234567.8e+90", "tail")
    38  	})
    39  
    40  	t.Run("error", func(t *testing.T) {
    41  		f := func(s, expectedTail string) {
    42  			t.Helper()
    43  
    44  			_, tail, err := parseRawNumber(s)
    45  			if err == nil {
    46  				t.Fatalf("expecting non-nil error")
    47  			}
    48  			if tail != expectedTail {
    49  				t.Fatalf("unexpected tail; got %q; want %q", tail, expectedTail)
    50  			}
    51  		}
    52  
    53  		f("xyz", "xyz")
    54  		f(" ", " ")
    55  		f("[", "[")
    56  		f(",", ",")
    57  		f("{", "{")
    58  		f("\"", "\"")
    59  	})
    60  }
    61  
    62  func TestUnescapeStringBestEffort(t *testing.T) {
    63  	t.Run("success", func(t *testing.T) {
    64  		testUnescapeStringBestEffort(t, ``, ``)
    65  		testUnescapeStringBestEffort(t, `\"`, `"`)
    66  		testUnescapeStringBestEffort(t, `\\`, `\`)
    67  		testUnescapeStringBestEffort(t, `\\\"`, `\"`)
    68  		testUnescapeStringBestEffort(t, `\\\"абв`, `\"абв`)
    69  		testUnescapeStringBestEffort(t, `йцук\n\"\\Y`, "йцук\n\"\\Y")
    70  		testUnescapeStringBestEffort(t, `q\u1234we`, "q\u1234we")
    71  		testUnescapeStringBestEffort(t, `п\ud83e\udd2dи`, "п🤭и")
    72  	})
    73  
    74  	t.Run("error", func(t *testing.T) {
    75  		testUnescapeStringBestEffort(t, `\`, ``)
    76  		testUnescapeStringBestEffort(t, `foo\qwe`, `foo\qwe`)
    77  		testUnescapeStringBestEffort(t, `\"x\uyz\"`, `"x\uyz"`)
    78  		testUnescapeStringBestEffort(t, `\u12\"пролw`, `\u12"пролw`)
    79  		testUnescapeStringBestEffort(t, `п\ud83eи`, "п\\ud83eи")
    80  	})
    81  }
    82  
    83  func testUnescapeStringBestEffort(t *testing.T, s, expectedS string) {
    84  	t.Helper()
    85  
    86  	// unescapeString modifies the original s, so call it
    87  	// on a byte slice copy.
    88  	b := append([]byte{}, s...)
    89  	us := unescapeStringBestEffort(b2s(b))
    90  	if us != expectedS {
    91  		t.Fatalf("unexpected unescaped string; got %q; want %q", us, expectedS)
    92  	}
    93  }
    94  
    95  func TestParseRawString(t *testing.T) {
    96  	t.Run("success", func(t *testing.T) {
    97  		f := func(s, expectedRS, expectedTail string) {
    98  			t.Helper()
    99  
   100  			rs, tail, err := parseRawString(s[1:])
   101  			if err != nil {
   102  				t.Fatalf("unexpected error on parseRawString: %s", err)
   103  			}
   104  			if rs != expectedRS {
   105  				t.Fatalf("unexpected string on parseRawString; got %q; want %q", rs, expectedRS)
   106  			}
   107  			if tail != expectedTail {
   108  				t.Fatalf("unexpected tail on parseRawString; got %q; want %q", tail, expectedTail)
   109  			}
   110  
   111  			// parseRawKey results must be identical to parseRawString.
   112  			rs, tail, err = parseRawKey(s[1:], false)
   113  			if err != nil {
   114  				t.Fatalf("unexpected error on parseRawKey: %s", err)
   115  			}
   116  			if rs != expectedRS {
   117  				t.Fatalf("unexpected string on parseRawKey; got %q; want %q", rs, expectedRS)
   118  			}
   119  			if tail != expectedTail {
   120  				t.Fatalf("unexpected tail on parseRawKey; got %q; want %q", tail, expectedTail)
   121  			}
   122  		}
   123  
   124  		f(`""`, "", "")
   125  		f(`""xx`, "", "xx")
   126  		f(`"foobar"`, "foobar", "")
   127  		f(`"foobar"baz`, "foobar", "baz")
   128  		f(`"\""`, `\"`, "")
   129  		f(`"\""tail`, `\"`, "tail")
   130  		f(`"\\"`, `\\`, "")
   131  		f(`"\\"tail`, `\\`, "tail")
   132  		f(`"x\\"`, `x\\`, "")
   133  		f(`"x\\"tail`, `x\\`, "tail")
   134  		f(`"x\\y"`, `x\\y`, "")
   135  		f(`"x\\y"tail`, `x\\y`, "tail")
   136  		f(`"\\\"й\n\"я"tail`, `\\\"й\n\"я`, "tail")
   137  		f(`"\\\\\\\\"tail`, `\\\\\\\\`, "tail")
   138  	})
   139  
   140  	t.Run("error", func(t *testing.T) {
   141  		f := func(s, expectedTail string) {
   142  			t.Helper()
   143  
   144  			_, tail, err := parseRawString(s[1:])
   145  			if err == nil {
   146  				t.Fatalf("expecting non-nil error on parseRawString")
   147  			}
   148  			if tail != expectedTail {
   149  				t.Fatalf("unexpected tail on parseRawString; got %q; want %q", tail, expectedTail)
   150  			}
   151  
   152  			// parseRawKey results must be identical to parseRawString.
   153  			_, tail, err = parseRawKey(s[1:], false)
   154  			if err == nil {
   155  				t.Fatalf("expecting non-nil error on parseRawKey")
   156  			}
   157  			if tail != expectedTail {
   158  				t.Fatalf("unexpected tail on parseRawKey; got %q; want %q", tail, expectedTail)
   159  			}
   160  		}
   161  
   162  		f(`"`, "")
   163  		f(`"unclosed string`, "")
   164  		f(`"\"`, "")
   165  		f(`"\"unclosed`, "")
   166  		f(`"foo\\\\\"тест\n\r\t`, "")
   167  	})
   168  }
   169  
   170  func TestParserPool(t *testing.T) {
   171  	var pp ParserPool
   172  	for i := 0; i < 10; i++ {
   173  		p := pp.Get()
   174  		if _, err := p.Parse("null"); err != nil {
   175  			t.Fatalf("cannot parse null: %s", err)
   176  		}
   177  		pp.Put(p)
   178  	}
   179  }
   180  
   181  func TestValueInvalidTypeConversion(t *testing.T) {
   182  	var p Parser
   183  
   184  	v, err := p.Parse(`[{},[],"",123.45,true,null]`)
   185  	if err != nil {
   186  		t.Fatalf("unexpected error: %s", err)
   187  	}
   188  	a := v.GetArray()
   189  
   190  	// object
   191  	_, err = a[0].Object()
   192  	if err != nil {
   193  		t.Fatalf("unexpected error when obtaining object: %s", err)
   194  	}
   195  	_, err = a[0].Array()
   196  	if err == nil {
   197  		t.Fatalf("expecting non-nil error when trying to obtain array from object")
   198  	}
   199  
   200  	// array
   201  	_, err = a[1].Array()
   202  	if err != nil {
   203  		t.Fatalf("unexpected error when obtaining array: %s", err)
   204  	}
   205  	_, err = a[1].Object()
   206  	if err == nil {
   207  		t.Fatalf("expecting non-nil error when trying to obtain object from array")
   208  	}
   209  
   210  	// string
   211  	_, err = a[2].StringBytes()
   212  	if err != nil {
   213  		t.Fatalf("unexpected error when obtaining string: %s", err)
   214  	}
   215  	_, err = a[2].Int()
   216  	if err == nil {
   217  		t.Fatalf("expecting non-nil error when trying to obtain int from string")
   218  	}
   219  
   220  	// number
   221  	_, err = a[3].Float64()
   222  	if err != nil {
   223  		t.Fatalf("unexpected error when obtaining float64: %s", err)
   224  	}
   225  	_, err = a[3].StringBytes()
   226  	if err == nil {
   227  		t.Fatalf("expecting non-nil error when trying to obtain string from number")
   228  	}
   229  
   230  	// true
   231  	_, err = a[4].Bool()
   232  	if err != nil {
   233  		t.Fatalf("unexpected error when obtaining bool: %s", err)
   234  	}
   235  	_, err = a[4].StringBytes()
   236  	if err == nil {
   237  		t.Fatalf("expecting non-nil error when trying to obtain string from bool")
   238  	}
   239  
   240  	// null
   241  	_, err = a[5].Bool()
   242  	if err == nil {
   243  		t.Fatalf("expecting non-nil error when trying to obtain bool from null")
   244  	}
   245  }
   246  
   247  func TestT2(t *testing.T) {
   248  	var p Parser
   249  	type TestObject struct {
   250  		field1 string
   251  	}
   252  	v, err := p.Parse(`[{day:"2019-04-11",open:"3241.547",high:"3254.126",low:"3185.546",close:"3189.962",volume:"35303187900",ma_price5:3232.587,ma_volume5:41419447120,ma_price10:3181.212,ma_volume10:40779040810,ma_price30:3089.348,ma_volume30:41522822373}]`)
   253  	if err != nil {
   254  		t.Errorf("%+v\n", err)
   255  	}
   256  	//should.Equal("Hello", obj.field1)
   257  	fmt.Println(v)
   258  }
   259  
   260  func TestValueGetTyped(t *testing.T) {
   261  	var p Parser
   262  
   263  	v, err := p.Parse(`{foo: 123, "bar": "433", "baz": true, "obj":{}, "arr":[1,2,3],
   264  		"zero_float1": 0.00,
   265  		"zero_float2": -0e123
   266  	}`)
   267  	if err != nil {
   268  		t.Fatalf("unexpected error: %s", err)
   269  	}
   270  
   271  	if !v.Exists("foo") {
   272  		t.Fatalf("foo must exist in the v")
   273  	}
   274  	if v.Exists("foo", "bar") {
   275  		t.Fatalf("foo.bar mustn't exist in the v")
   276  	}
   277  	if v.Exists("foobar") {
   278  		t.Fatalf("foobar mustn't exist in the v")
   279  	}
   280  
   281  	o := v.GetObject("obj")
   282  	os := o.String()
   283  	if os != "{}" {
   284  		t.Fatalf("unexpected object; got %s; want %s", os, "{}")
   285  	}
   286  	o = v.GetObject("arr")
   287  	if o != nil {
   288  		t.Fatalf("unexpected non-nil object: %s", o)
   289  	}
   290  	o = v.GetObject("foo", "bar")
   291  	if o != nil {
   292  		t.Fatalf("unexpected non-nil object: %s", o)
   293  	}
   294  	a := v.GetArray("arr")
   295  	if len(a) != 3 {
   296  		t.Fatalf("unexpected array len; got %d; want %d", len(a), 3)
   297  	}
   298  	a = v.GetArray("obj")
   299  	if a != nil {
   300  		t.Fatalf("unexpected non-nil array: %s", a)
   301  	}
   302  	a = v.GetArray("foo", "bar")
   303  	if a != nil {
   304  		t.Fatalf("unexpected non-nil array: %s", a)
   305  	}
   306  	n := v.GetInt("foo")
   307  	if n != 123 {
   308  		t.Fatalf("unexpected value; got %d; want %d", n, 123)
   309  	}
   310  	un := v.GetUint("foo")
   311  	if un != 123 {
   312  		t.Fatalf("unexpected value; got %d; want %d", un, 123)
   313  	}
   314  	n = v.GetInt("bar")
   315  	if n != 0 {
   316  		t.Fatalf("unexpected non-zero value; got %d", n)
   317  	}
   318  	f := v.GetFloat64("foo")
   319  	if f != 123.0 {
   320  		t.Fatalf("unexpected value; got %f; want %f", f, 123.0)
   321  	}
   322  	f = v.GetFloat64("bar")
   323  	if f != 0 {
   324  		t.Fatalf("unexpected value; got %f; want %f", f, 0.0)
   325  	}
   326  	f = v.GetFloat64("foooo", "bar")
   327  	if f != 0 {
   328  		t.Fatalf("unexpected value; got %f; want %f", f, 0.0)
   329  	}
   330  	f = v.GetFloat64()
   331  	if f != 0 {
   332  		t.Fatalf("unexpected value; got %f; want %f", f, 0.0)
   333  	}
   334  	sb := v.GetStringBytes("bar")
   335  	if string(sb) != "433" {
   336  		t.Fatalf("unexpected value; got %q; want %q", sb, "443")
   337  	}
   338  	sb = v.GetStringBytes("foo")
   339  	if sb != nil {
   340  		t.Fatalf("unexpected value; got %q; want %q", sb, []byte(nil))
   341  	}
   342  	bv := v.GetBool("baz")
   343  	if !bv {
   344  		t.Fatalf("unexpected value; got %v; want %v", bv, true)
   345  	}
   346  	bv = v.GetBool("bar")
   347  	if bv {
   348  		t.Fatalf("unexpected value; got %v; want %v", bv, false)
   349  	}
   350  
   351  	zv := v.Get("zero_float1")
   352  	zf, err := zv.Float64()
   353  	if err != nil {
   354  		t.Fatalf("unexpected error: %s", err)
   355  	}
   356  	if zf != 0 {
   357  		t.Fatalf("unexpected zero_float1 value: %f. Expecting 0", zf)
   358  	}
   359  
   360  	zv = v.Get("zero_float2")
   361  	zf, err = zv.Float64()
   362  	if err != nil {
   363  		t.Fatalf("unexpected error: %s", err)
   364  	}
   365  	if zf != 0 {
   366  		t.Fatalf("unexpected zero_float1 value: %f. Expecting 0", zf)
   367  	}
   368  }
   369  
   370  func TestVisitNil(t *testing.T) {
   371  	var p Parser
   372  	v, err := p.Parse(`{}`)
   373  	if err != nil {
   374  		t.Fatalf("unexpected error: %s", err)
   375  	}
   376  	o := v.GetObject("non-existing-key")
   377  	if o != nil {
   378  		t.Fatalf("obtained an object for non-existing key: %#v", o)
   379  	}
   380  	o.Visit(func(k []byte, v *Value) {
   381  		t.Fatalf("unexpected visit call; k=%q; v=%s", k, v)
   382  	})
   383  }
   384  
   385  func TestValueGet(t *testing.T) {
   386  	var pp ParserPool
   387  
   388  	p := pp.Get()
   389  	v, err := p.ParseBytes([]byte(`{"xx":33.33,"foo":[123,{"bar":["baz"],"x":"y"}], "": "empty-key", "empty-value": ""}`))
   390  	if err != nil {
   391  		t.Fatalf("unexpected error: %s", err)
   392  	}
   393  
   394  	t.Run("positive", func(t *testing.T) {
   395  		sb := v.GetStringBytes("")
   396  		if string(sb) != "empty-key" {
   397  			t.Fatalf("unexpected value for empty key; got %q; want %q", sb, "empty-key")
   398  		}
   399  		sb = v.GetStringBytes("empty-value")
   400  		if string(sb) != "" {
   401  			t.Fatalf("unexpected non-empty value: %q", sb)
   402  		}
   403  
   404  		vv := v.Get("foo", "1")
   405  		if vv == nil {
   406  			t.Fatalf("cannot find the required value")
   407  		}
   408  		o, err := vv.Object()
   409  		if err != nil {
   410  			t.Fatalf("cannot obtain object: %s", err)
   411  		}
   412  
   413  		n := 0
   414  		o.Visit(func(k []byte, v *Value) {
   415  			n++
   416  			switch string(k) {
   417  			case "bar":
   418  				if v.Type() != TypeArray {
   419  					t.Fatalf("unexpected value type; got %d; want %d", v.Type(), TypeArray)
   420  				}
   421  				s := v.String()
   422  				if s != `["baz"]` {
   423  					t.Fatalf("unexpected array; got %q; want %q", s, `["baz"]`)
   424  				}
   425  			case "x":
   426  				sb, err := v.StringBytes()
   427  				if err != nil {
   428  					t.Fatalf("cannot obtain string: %s", err)
   429  				}
   430  				if string(sb) != "y" {
   431  					t.Fatalf("unexpected string; got %q; want %q", sb, "y")
   432  				}
   433  			default:
   434  				t.Fatalf("unknown key: %s", k)
   435  			}
   436  		})
   437  		if n != 2 {
   438  			t.Fatalf("unexpected number of items visited in the array; got %d; want %d", n, 2)
   439  		}
   440  	})
   441  
   442  	t.Run("negative", func(t *testing.T) {
   443  		vv := v.Get("nonexisting", "path")
   444  		if vv != nil {
   445  			t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv)
   446  		}
   447  		vv = v.Get("foo", "bar", "baz")
   448  		if vv != nil {
   449  			t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv)
   450  		}
   451  		vv = v.Get("foo", "-123")
   452  		if vv != nil {
   453  			t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv)
   454  		}
   455  		vv = v.Get("foo", "234")
   456  		if vv != nil {
   457  			t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv)
   458  		}
   459  		vv = v.Get("xx", "yy")
   460  		if vv != nil {
   461  			t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv)
   462  		}
   463  	})
   464  
   465  	pp.Put(p)
   466  }
   467  
   468  func TestParserParse(t *testing.T) {
   469  	var p Parser
   470  
   471  	t.Run("complex-string", func(t *testing.T) {
   472  		v, err := p.Parse(`{"тест":1, "\\\"фыва\"":2, "\\\"\u1234x":"\\fЗУ\\\\"}`)
   473  		if err != nil {
   474  			t.Fatalf("unexpected error: %s", err)
   475  		}
   476  		n := v.GetInt("тест")
   477  		if n != 1 {
   478  			t.Fatalf("unexpected int; got %d; want %d", n, 1)
   479  		}
   480  		n = v.GetInt(`\"фыва"`)
   481  		if n != 2 {
   482  			t.Fatalf("unexpected int; got %d; want %d", n, 2)
   483  		}
   484  		sb := v.GetStringBytes("\\\"\u1234x")
   485  		if string(sb) != `\fЗУ\\` {
   486  			t.Fatalf("unexpected string; got %q; want %q", sb, `\fЗУ\\`)
   487  		}
   488  	})
   489  
   490  	t.Run("invalid-string-escape", func(t *testing.T) {
   491  		v, err := p.Parse(`"fo\u"`)
   492  		if err != nil {
   493  			t.Fatalf("unexpected error when parsing string")
   494  		}
   495  		// Make sure only valid string part remains
   496  		sb, err := v.StringBytes()
   497  		if err != nil {
   498  			t.Fatalf("cannot obtain string: %s", err)
   499  		}
   500  		if string(sb) != "fo\\u" {
   501  			t.Fatalf("unexpected string; got %q; want %q", sb, "fo\\u")
   502  		}
   503  
   504  		v, err = p.Parse(`"foo\ubarz2134"`)
   505  		if err != nil {
   506  			t.Fatalf("unexpected error when parsing string")
   507  		}
   508  		sb, err = v.StringBytes()
   509  		if err != nil {
   510  			t.Fatalf("cannot obtain string: %s", err)
   511  		}
   512  		if string(sb) != "foo\\ubarz2134" {
   513  			t.Fatalf("unexpected string; got %q; want %q", sb, "foo")
   514  		}
   515  	})
   516  
   517  	t.Run("invalid-number", func(t *testing.T) {
   518  		v, err := p.Parse("123+456")
   519  		if err != nil {
   520  			t.Fatalf("unexpected error when parsing int")
   521  		}
   522  
   523  		// Make sure invalid int isn't parsed.
   524  		n, err := v.Int()
   525  		if err == nil {
   526  			t.Fatalf("expecting non-nil error")
   527  		}
   528  		if n != 0 {
   529  			t.Fatalf("unexpected int; got %d; want %d", n, 0)
   530  		}
   531  	})
   532  
   533  	t.Run("empty-fastjson", func(t *testing.T) {
   534  		_, err := p.Parse("")
   535  		if err == nil {
   536  			t.Fatalf("expecting non-nil error when parsing empty fastjson")
   537  		}
   538  		_, err = p.Parse("\n\t    \n")
   539  		if err == nil {
   540  			t.Fatalf("expecting non-nil error when parsing empty fastjson")
   541  		}
   542  	})
   543  
   544  	t.Run("invalid-tail", func(t *testing.T) {
   545  		_, err := p.Parse("123 456")
   546  		if err == nil {
   547  			t.Fatalf("expecting non-nil error when parsing invalid tail")
   548  		}
   549  		_, err = p.Parse("[] 1223")
   550  		if err == nil {
   551  			t.Fatalf("expecting non-nil error when parsing invalid tail")
   552  		}
   553  	})
   554  
   555  	t.Run("invalid-fastjson", func(t *testing.T) {
   556  		f := func(s string) {
   557  			t.Helper()
   558  			if _, err := p.Parse(s); err == nil {
   559  				t.Fatalf("expecting non-nil error when parsing invalid fastjson %q", s)
   560  			}
   561  		}
   562  
   563  		f("free")
   564  		f("tree")
   565  		f("\x00\x10123")
   566  		f("1 \n\x01")
   567  		f("{\x00}")
   568  		f("[\x00]")
   569  		f("\"foo\"\x00")
   570  		f("{\"foo\"\x00:123}")
   571  		f("nil")
   572  		f("[foo]")
   573  		f("{foo}")
   574  		f("[123 34]")
   575  		f(`{"foo" "bar"}`)
   576  		f(`{"foo":123 "bar":"baz"}`)
   577  		f("-2134.453eec+43")
   578  
   579  		if _, err := p.Parse("-2134.453E+43"); err != nil {
   580  			t.Fatalf("unexpected error when parsing number: %s", err)
   581  		}
   582  
   583  		// Incomplete object key key.
   584  		f(`{"foo: 123}`)
   585  
   586  		// Incomplete string.
   587  		f(`"{\"foo\": 123}`)
   588  
   589  		v, err := p.Parse(`"{\"foo\": 123}"`)
   590  		if err != nil {
   591  			t.Fatalf("unexpected error when parsing fastjson string: %s", err)
   592  		}
   593  		sb := v.GetStringBytes()
   594  		if string(sb) != `{"foo": 123}` {
   595  			t.Fatalf("unexpected string value; got %q; want %q", sb, `{"foo": 123}`)
   596  		}
   597  	})
   598  
   599  	t.Run("incomplete-object", func(t *testing.T) {
   600  		f := func(s string) {
   601  			t.Helper()
   602  			if _, err := p.Parse(s); err == nil {
   603  				t.Fatalf("expecting non-nil error when parsing incomplete object %q", s)
   604  			}
   605  		}
   606  
   607  		f(" {  ")
   608  		f(`{"foo"`)
   609  		f(`{"foo":`)
   610  		f(`{"foo":null`)
   611  		f(`{"foo":null,`)
   612  		f(`{"foo":null,}`)
   613  		f(`{"foo":null,"bar"}`)
   614  
   615  		if _, err := p.Parse(`{"foo":null,"bar":"baz"}`); err != nil {
   616  			t.Fatalf("unexpected error when parsing object: %s", err)
   617  		}
   618  	})
   619  
   620  	t.Run("incomplete-array", func(t *testing.T) {
   621  		f := func(s string) {
   622  			t.Helper()
   623  			if _, err := p.Parse(s); err == nil {
   624  				t.Fatalf("expecting non-nil error when parsing incomplete array %q", s)
   625  			}
   626  		}
   627  
   628  		f("  [ ")
   629  		f("[123")
   630  		f("[123,")
   631  		f("[123,]")
   632  		f("[123,{}")
   633  		f("[123,{},]")
   634  
   635  		if _, err := p.Parse("[123,{},[]]"); err != nil {
   636  			t.Fatalf("unexpected error when parsing array: %s", err)
   637  		}
   638  	})
   639  
   640  	t.Run("incomplete-string", func(t *testing.T) {
   641  		f := func(s string) {
   642  			t.Helper()
   643  			if _, err := p.Parse(s); err == nil {
   644  				t.Fatalf("expecting non-nil error when parsing incomplete string %q", s)
   645  			}
   646  		}
   647  
   648  		f(`  "foo`)
   649  		f(`"foo\`)
   650  		f(`"foo\"`)
   651  		f(`"foo\\\"`)
   652  		f(`"foo'`)
   653  		f(`"foo'bar'`)
   654  
   655  		if _, err := p.Parse(`"foo\\\""`); err != nil {
   656  			t.Fatalf("unexpected error when parsing string: %s", err)
   657  		}
   658  	})
   659  
   660  	t.Run("empty-object", func(t *testing.T) {
   661  		v, err := p.Parse("{}")
   662  		if err != nil {
   663  			t.Fatalf("cannot parse empty object: %s", err)
   664  		}
   665  		tp := v.Type()
   666  		if tp != TypeObject || tp.String() != "object" {
   667  			t.Fatalf("unexpected value obtained for empty object: %#v", v)
   668  		}
   669  		o, err := v.Object()
   670  		if err != nil {
   671  			t.Fatalf("cannot obtain object: %s", err)
   672  		}
   673  		n := o.Len()
   674  		if n != 0 {
   675  			t.Fatalf("unexpected number of items in empty object: %d; want 0", n)
   676  		}
   677  		s := v.String()
   678  		if s != "{}" {
   679  			t.Fatalf("unexpected string representation of empty object: got %q; want %q", s, "{}")
   680  		}
   681  	})
   682  
   683  	t.Run("empty-array", func(t *testing.T) {
   684  		v, err := p.Parse("[]")
   685  		if err != nil {
   686  			t.Fatalf("cannot parse empty array: %s", err)
   687  		}
   688  		tp := v.Type()
   689  		if tp != TypeArray || tp.String() != "array" {
   690  			t.Fatalf("unexpected value obtained for empty array: %#v", v)
   691  		}
   692  		a, err := v.Array()
   693  		if err != nil {
   694  			t.Fatalf("unexpected error: %s", err)
   695  		}
   696  		n := len(a)
   697  		if n != 0 {
   698  			t.Fatalf("unexpected number of items in empty array: %d; want 0", n)
   699  		}
   700  		s := v.String()
   701  		if s != "[]" {
   702  			t.Fatalf("unexpected string representation of empty array: got %q; want %q", s, "[]")
   703  		}
   704  	})
   705  
   706  	t.Run("null", func(t *testing.T) {
   707  		v, err := p.Parse("null")
   708  		if err != nil {
   709  			t.Fatalf("cannot parse null: %s", err)
   710  		}
   711  		tp := v.Type()
   712  		if tp != TypeNull || tp.String() != "null" {
   713  			t.Fatalf("unexpected value obtained for null: %#v", v)
   714  		}
   715  		s := v.String()
   716  		if s != "null" {
   717  			t.Fatalf("unexpected string representation of null; got %q; want %q", s, "null")
   718  		}
   719  	})
   720  
   721  	t.Run("true", func(t *testing.T) {
   722  		v, err := p.Parse("true")
   723  		if err != nil {
   724  			t.Fatalf("cannot parse true: %s", err)
   725  		}
   726  		tp := v.Type()
   727  		if tp != TypeTrue || tp.String() != "true" {
   728  			t.Fatalf("unexpected value obtained for true: %#v", v)
   729  		}
   730  		b, err := v.Bool()
   731  		if err != nil {
   732  			t.Fatalf("unexpected error: %s", err)
   733  		}
   734  		if !b {
   735  			t.Fatalf("expecting true; got false")
   736  		}
   737  		s := v.String()
   738  		if s != "true" {
   739  			t.Fatalf("unexpected string representation of true; got %q; want %q", s, "true")
   740  		}
   741  	})
   742  
   743  	t.Run("false", func(t *testing.T) {
   744  		v, err := p.Parse("false")
   745  		if err != nil {
   746  			t.Fatalf("cannot parse false: %s", err)
   747  		}
   748  		tp := v.Type()
   749  		if tp != TypeFalse || tp.String() != "false" {
   750  			t.Fatalf("unexpected value obtained for false: %#v", v)
   751  		}
   752  		b, err := v.Bool()
   753  		if err != nil {
   754  			t.Fatalf("unexpected error: %s", err)
   755  		}
   756  		if b {
   757  			t.Fatalf("expecting false; got true")
   758  		}
   759  		s := v.String()
   760  		if s != "false" {
   761  			t.Fatalf("unexpected string representation of false; got %q; want %q", s, "false")
   762  		}
   763  	})
   764  
   765  	t.Run("integer", func(t *testing.T) {
   766  		v, err := p.Parse("12345")
   767  		if err != nil {
   768  			t.Fatalf("cannot parse integer: %s", err)
   769  		}
   770  		tp := v.Type()
   771  		if tp != TypeNumber || tp.String() != "number" {
   772  			t.Fatalf("unexpected type obtained for integer: %#v", v)
   773  		}
   774  		n, err := v.Int()
   775  		if err != nil {
   776  			t.Fatalf("cannot obtain int: %s", err)
   777  		}
   778  		if n != 12345 {
   779  			t.Fatalf("unexpected value obtained for integer; got %d; want %d", n, 12345)
   780  		}
   781  		s := v.String()
   782  		if s != "12345" {
   783  			t.Fatalf("unexpected string representation of integer; got %q; want %q", s, "12345")
   784  		}
   785  	})
   786  
   787  	t.Run("int64", func(t *testing.T) {
   788  		v, err := p.Parse("-8838840643388017390")
   789  		if err != nil {
   790  			t.Fatalf("cannot parse int64: %s", err)
   791  		}
   792  		tp := v.Type()
   793  		if tp != TypeNumber || tp.String() != "number" {
   794  			t.Fatalf("unexpected type obtained for int64: %#v", v)
   795  		}
   796  		n, err := v.Int64()
   797  		if err != nil {
   798  			t.Fatalf("cannot obtain int64: %s", err)
   799  		}
   800  		if n != -8838840643388017390 {
   801  			t.Fatalf("unexpected value obtained for int64; got %d; want %d", n, -8838840643388017390)
   802  		}
   803  		s := v.String()
   804  		if s != "-8838840643388017390" {
   805  			t.Fatalf("unexpected string representation of int64; got %q; want %q", s, "-8838840643388017390")
   806  		}
   807  	})
   808  
   809  	t.Run("uint64", func(t *testing.T) {
   810  		v, err := p.Parse("18446744073709551615")
   811  		if err != nil {
   812  			t.Fatalf("cannot parse uint64: %s", err)
   813  		}
   814  		tp := v.Type()
   815  		if tp != TypeNumber || tp.String() != "number" {
   816  			t.Fatalf("unexpected type obtained for uint64: %#v", v)
   817  		}
   818  		n, err := v.Uint64()
   819  		if err != nil {
   820  			t.Fatalf("cannot obtain uint64: %s", err)
   821  		}
   822  		if n != 18446744073709551615 {
   823  			t.Fatalf("unexpected value obtained for uint64; got %d; want %d", n, uint64(18446744073709551615))
   824  		}
   825  		s := v.String()
   826  		if s != "18446744073709551615" {
   827  			t.Fatalf("unexpected string representation of uint64; got %q; want %q", s, "18446744073709551615")
   828  		}
   829  	})
   830  
   831  	t.Run("float", func(t *testing.T) {
   832  		v, err := p.Parse("-12.345")
   833  		if err != nil {
   834  			t.Fatalf("cannot parse integer: %s", err)
   835  		}
   836  		n, err := v.Float64()
   837  		if err != nil {
   838  			t.Fatalf("unexpected error: %s", err)
   839  		}
   840  		tp := v.Type()
   841  		if tp != TypeNumber || tp.String() != "number" {
   842  			t.Fatalf("unexpected type obtained for integer: %#v", v)
   843  		}
   844  		if n != -12.345 {
   845  			t.Fatalf("unexpected value obtained for integer; got %f; want %f", n, -12.345)
   846  		}
   847  		s := v.String()
   848  		if s != "-12.345" {
   849  			t.Fatalf("unexpected string representation of integer; got %q; want %q", s, "-12.345")
   850  		}
   851  	})
   852  
   853  	t.Run("string", func(t *testing.T) {
   854  		v, err := p.Parse(`"foo bar"`)
   855  		if err != nil {
   856  			t.Fatalf("cannot parse string: %s", err)
   857  		}
   858  		tp := v.Type()
   859  		if tp != TypeString || tp.String() != "string" {
   860  			t.Fatalf("unexpected type obtained for string: %#v", v)
   861  		}
   862  		sb, err := v.StringBytes()
   863  		if err != nil {
   864  			t.Fatalf("cannot obtain string: %s", err)
   865  		}
   866  		if string(sb) != "foo bar" {
   867  			t.Fatalf("unexpected value obtained for string; got %q; want %q", sb, "foo bar")
   868  		}
   869  		ss := v.String()
   870  		if ss != `"foo bar"` {
   871  			t.Fatalf("unexpected string representation of string; got %q; want %q", ss, `"foo bar"`)
   872  		}
   873  	})
   874  
   875  	t.Run("string-escaped", func(t *testing.T) {
   876  		v, err := p.Parse(`"\n\t\\foo\"bar\u3423x\/\b\f\r\\"`)
   877  		if err != nil {
   878  			t.Fatalf("cannot parse string: %s", err)
   879  		}
   880  		tp := v.Type()
   881  		if tp != TypeString {
   882  			t.Fatalf("unexpected type obtained for string: %#v", v)
   883  		}
   884  		sb, err := v.StringBytes()
   885  		if err != nil {
   886  			t.Fatalf("cannot obtain string: %s", err)
   887  		}
   888  		if string(sb) != "\n\t\\foo\"bar\u3423x/\b\f\r\\" {
   889  			t.Fatalf("unexpected value obtained for string; got %q; want %q", sb, "\n\t\\foo\"bar\u3423x/\b\f\r\\")
   890  		}
   891  		ss := v.String()
   892  		if ss != `"\n\t\\foo\"bar㐣x/\b\f\r\\"` {
   893  			t.Fatalf("unexpected string representation of string; got %q; want %q", ss, `"\n\t\\foo\"bar㐣x/\b\f\r\\"`)
   894  		}
   895  	})
   896  
   897  	t.Run("object-one-element", func(t *testing.T) {
   898  		v, err := p.Parse(`  {
   899  	"foo"   : "bar"  }	 `)
   900  		if err != nil {
   901  			t.Fatalf("cannot parse object: %s", err)
   902  		}
   903  		tp := v.Type()
   904  		if tp != TypeObject {
   905  			t.Fatalf("unexpected type obtained for object: %#v", v)
   906  		}
   907  		o, err := v.Object()
   908  		if err != nil {
   909  			t.Fatalf("cannot obtain object: %s", err)
   910  		}
   911  		vv := o.Get("foo")
   912  		if vv.Type() != TypeString {
   913  			t.Fatalf("unexpected type for foo item: got %d; want %d", vv.Type(), TypeString)
   914  		}
   915  		vv = o.Get("non-existing key")
   916  		if vv != nil {
   917  			t.Fatalf("unexpected value obtained for non-existing key: %#v", vv)
   918  		}
   919  
   920  		s := v.String()
   921  		if s != `{"foo":"bar"}` {
   922  			t.Fatalf("unexpected string representation for object; got %q; want %q", s, `{"foo":"bar"}`)
   923  		}
   924  	})
   925  
   926  	t.Run("object-multi-elements", func(t *testing.T) {
   927  		v, err := p.Parse(`{"foo": [1,2,3  ]  ,"bar":{},"baz":123.456}`)
   928  		if err != nil {
   929  			t.Fatalf("cannot parse object: %s", err)
   930  		}
   931  		tp := v.Type()
   932  		if tp != TypeObject {
   933  			t.Fatalf("unexpected type obtained for object: %#v", v)
   934  		}
   935  		o, err := v.Object()
   936  		if err != nil {
   937  			t.Fatalf("cannot obtain object: %s", err)
   938  		}
   939  		vv := o.Get("foo")
   940  		if vv.Type() != TypeArray {
   941  			t.Fatalf("unexpected type for foo item; got %d; want %d", vv.Type(), TypeArray)
   942  		}
   943  		vv = o.Get("bar")
   944  		if vv.Type() != TypeObject {
   945  			t.Fatalf("unexpected type for bar item; got %d; want %d", vv.Type(), TypeObject)
   946  		}
   947  		vv = o.Get("baz")
   948  		if vv.Type() != TypeNumber {
   949  			t.Fatalf("unexpected type for baz item; got %d; want %d", vv.Type(), TypeNumber)
   950  		}
   951  		vv = o.Get("non-existing-key")
   952  		if vv != nil {
   953  			t.Fatalf("unexpected value obtained for non-existing key: %#v", vv)
   954  		}
   955  
   956  		s := v.String()
   957  		if s != `{"foo":[1,2,3],"bar":{},"baz":123.456}` {
   958  			t.Fatalf("unexpected string representation for object; got %q; want %q", s, `{"foo":[1,2,3],"bar":{},"baz":123.456}`)
   959  		}
   960  	})
   961  
   962  	t.Run("array-one-element", func(t *testing.T) {
   963  		v, err := p.Parse(`   [{"bar":[  [],[[]]   ]} ]  `)
   964  		if err != nil {
   965  			t.Fatalf("cannot parse array: %s", err)
   966  		}
   967  		tp := v.Type()
   968  		if tp != TypeArray {
   969  			t.Fatalf("unexpected type obtained for array: %#v", v)
   970  		}
   971  		a, err := v.Array()
   972  		if err != nil {
   973  			t.Fatalf("unexpected error: %s", err)
   974  		}
   975  		if len(a) != 1 {
   976  			t.Fatalf("unexpected array len; got %d; want %d", len(a), 1)
   977  		}
   978  		if a[0].Type() != TypeObject {
   979  			t.Fatalf("unexpected type for a[0]; got %d; want %d", a[0].Type(), TypeObject)
   980  		}
   981  
   982  		s := v.String()
   983  		if s != `[{"bar":[[],[[]]]}]` {
   984  			t.Fatalf("unexpected string representation for array; got %q; want %q", s, `[{"bar":[[],[[]]]}]`)
   985  		}
   986  	})
   987  
   988  	t.Run("array-multi-elements", func(t *testing.T) {
   989  		v, err := p.Parse(`   [1,"foo",{"bar":[     ],"baz":""}    ,[  "x" ,	"y"   ]     ]   `)
   990  		if err != nil {
   991  			t.Fatalf("cannot parse array: %s", err)
   992  		}
   993  		tp := v.Type()
   994  		if tp != TypeArray {
   995  			t.Fatalf("unexpected type obtained for array: %#v", v)
   996  		}
   997  		a, err := v.Array()
   998  		if err != nil {
   999  			t.Fatalf("unexpected error: %s", err)
  1000  		}
  1001  		if len(a) != 4 {
  1002  			t.Fatalf("unexpected array len; got %d; want %d", len(a), 4)
  1003  		}
  1004  		if a[0].Type() != TypeNumber {
  1005  			t.Fatalf("unexpected type for a[0]; got %d; want %d", a[0].Type(), TypeNumber)
  1006  		}
  1007  		if a[1].Type() != TypeString {
  1008  			t.Fatalf("unexpected type for a[1]; got %d; want %d", a[1].Type(), TypeString)
  1009  		}
  1010  		if a[2].Type() != TypeObject {
  1011  			t.Fatalf("unexpected type for a[2]; got %d; want %d", a[2].Type(), TypeObject)
  1012  		}
  1013  		if a[3].Type() != TypeArray {
  1014  			t.Fatalf("unexpected type for a[3]; got %d; want %d", a[3].Type(), TypeArray)
  1015  		}
  1016  
  1017  		s := v.String()
  1018  		if s != `[1,"foo",{"bar":[],"baz":""},["x","y"]]` {
  1019  			t.Fatalf("unexpected string representation for array; got %q; want %q", s, `[1,"foo",{"bar":[],"baz":""},["x","y"]]`)
  1020  		}
  1021  	})
  1022  
  1023  	t.Run("complex-object", func(t *testing.T) {
  1024  		s := `{"foo":[-1.345678,[[[[[]]]],{}],"bar"],"baz":{"bbb":123}}`
  1025  		v, err := p.Parse(s)
  1026  		if err != nil {
  1027  			t.Fatalf("cannot parse complex object: %s", err)
  1028  		}
  1029  		if v.Type() != TypeObject {
  1030  			t.Fatalf("unexpected type obtained for object: %#v", v)
  1031  		}
  1032  
  1033  		ss := v.String()
  1034  		if ss != s {
  1035  			t.Fatalf("unexpected string representation for object; got %q; want %q", ss, s)
  1036  		}
  1037  
  1038  		s = strings.TrimSpace(largeFixture)
  1039  		v, err = p.Parse(s)
  1040  		if err != nil {
  1041  			t.Fatalf("cannot parse largeFixture: %s", err)
  1042  		}
  1043  		ss = v.String()
  1044  		if ss != s {
  1045  			t.Fatalf("unexpected string representation for object; got\n%q; want\n%q", ss, s)
  1046  		}
  1047  	})
  1048  
  1049  	t.Run("complex-object-visit-all", func(t *testing.T) {
  1050  		n := 0
  1051  		var f func(k []byte, v *Value)
  1052  		f = func(k []byte, v *Value) {
  1053  			switch v.Type() {
  1054  			case TypeObject:
  1055  				o, err := v.Object()
  1056  				if err != nil {
  1057  					t.Fatalf("cannot obtain object: %s", err)
  1058  				}
  1059  				o.Visit(f)
  1060  			case TypeArray:
  1061  				a, err := v.Array()
  1062  				if err != nil {
  1063  					t.Fatalf("unexpected error: %s", err)
  1064  				}
  1065  				for _, vv := range a {
  1066  					f(nil, vv)
  1067  				}
  1068  			case TypeString:
  1069  				sb, err := v.StringBytes()
  1070  				if err != nil {
  1071  					t.Fatalf("cannot obtain string: %s", err)
  1072  				}
  1073  				n += len(sb)
  1074  			case TypeNumber:
  1075  				nn, err := v.Int()
  1076  				if err != nil {
  1077  					t.Fatalf("cannot obtain int: %s", err)
  1078  				}
  1079  				n += nn
  1080  			}
  1081  		}
  1082  
  1083  		s := strings.TrimSpace(largeFixture)
  1084  		v, err := p.Parse(s)
  1085  		if err != nil {
  1086  			t.Fatalf("cannot parse largeFixture: %s", err)
  1087  		}
  1088  		o, err := v.Object()
  1089  		if err != nil {
  1090  			t.Fatalf("cannot obtain object: %s", err)
  1091  		}
  1092  		o.Visit(f)
  1093  
  1094  		if n != 21473 {
  1095  			t.Fatalf("unexpected n; got %d; want %d", n, 21473)
  1096  		}
  1097  
  1098  		// Make sure the fastjson remains valid after visiting all the items.
  1099  		ss := v.String()
  1100  		if ss != s {
  1101  			t.Fatalf("unexpected string representation for object; got\n%q; want\n%q", ss, s)
  1102  		}
  1103  
  1104  	})
  1105  }
  1106  
  1107  func TestParseBigObject(t *testing.T) {
  1108  	const itemsCount = 10000
  1109  
  1110  	// build big fastjson object
  1111  	var ss []string
  1112  	for i := 0; i < itemsCount; i++ {
  1113  		s := fmt.Sprintf(`"key_%d": "value_%d"`, i, i)
  1114  		ss = append(ss, s)
  1115  	}
  1116  	s := "{" + strings.Join(ss, ",") + "}"
  1117  
  1118  	// parse it
  1119  	var p Parser
  1120  	v, err := p.Parse(s)
  1121  	if err != nil {
  1122  		t.Fatalf("unexpected error: %s", err)
  1123  	}
  1124  
  1125  	// Look up object items
  1126  	for i := 0; i < itemsCount; i++ {
  1127  		k := fmt.Sprintf("key_%d", i)
  1128  		expectedV := fmt.Sprintf("value_%d", i)
  1129  		sb := v.GetStringBytes(k)
  1130  		if string(sb) != expectedV {
  1131  			t.Fatalf("unexpected value obtained; got %q; want %q", sb, expectedV)
  1132  		}
  1133  	}
  1134  
  1135  	// verify non-existing key returns nil
  1136  	sb := v.GetStringBytes("non-existing-key")
  1137  	if sb != nil {
  1138  		t.Fatalf("unexpected non-nil value for non-existing-key: %q", sb)
  1139  	}
  1140  }
  1141  
  1142  func TestParseGetConcurrent(t *testing.T) {
  1143  	concurrency := 10
  1144  	ch := make(chan error, concurrency)
  1145  	s := `{"foo": "bar", "empty_obj": {}}`
  1146  	for i := 0; i < concurrency; i++ {
  1147  		go func() {
  1148  			ch <- testParseGetSerial(s)
  1149  		}()
  1150  	}
  1151  	for i := 0; i < concurrency; i++ {
  1152  		select {
  1153  		case err := <-ch:
  1154  			if err != nil {
  1155  				t.Fatalf("unexpected error during concurrent test: %s", err)
  1156  			}
  1157  		case <-time.After(time.Second):
  1158  			t.Fatalf("timeout")
  1159  		}
  1160  	}
  1161  }
  1162  
  1163  func testParseGetSerial(s string) error {
  1164  	var p Parser
  1165  	for i := 0; i < 100; i++ {
  1166  		v, err := p.Parse(s)
  1167  		if err != nil {
  1168  			return fmt.Errorf("cannot parse %q: %s", s, err)
  1169  		}
  1170  		sb := v.GetStringBytes("foo")
  1171  		if string(sb) != "bar" {
  1172  			return fmt.Errorf("unexpected value for key=%q; got %q; want %q", "foo", sb, "bar")
  1173  		}
  1174  		vv := v.Get("empty_obj", "non-existing-key")
  1175  		if vv != nil {
  1176  			return fmt.Errorf("unexpected non-nil value got: %s", vv)
  1177  		}
  1178  	}
  1179  	return nil
  1180  }
  1181  
  1182  type KLine struct {
  1183  	Day [][]string `json:"day"`
  1184  }
  1185  
  1186  type ActionStatus struct {
  1187  	Code int    `json:"code,status"`
  1188  	Msg  string `json:"msg"`
  1189  }
  1190  
  1191  type klineData struct {
  1192  	ActionStatus
  1193  	Data map[string]KLine `json:"data"`
  1194  }
  1195  
  1196  func TestParseKLine(t *testing.T) {
  1197  	data := `{"code":1,"msg":"success","data":{"sh000001":{"day":[["2021-07-09","3512.230","3524.090","3529.310","3485.050","349884317.000"]],"qt":{"sh000001":["1","\u4e0a\u8bc1\u6307\u6570","000001","3524.09","3525.50","3512.23","349884317","174942159","174942159","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","","20210709155956","-1.41","-0.04","3529.31","3485.05","3524.09\/349884317\/493020839328","349884317","49302084","0.82","14.22","","3529.31","3485.05","1.26","392004.84","500586.05","0.00","-1","-1","1.12","0","3510.12","","","","","","49302083.9328","0.0000","0"," ","ZS","1.47","0.15","","","","3731.69","3174.66","-2.31","-2.40","3.26","","","-0.98"],"market":["2021-07-10 07:04:01|HK_close_\u5df2\u4f11\u5e02|SH_close_\u5df2\u4f11\u5e02|SZ_close_\u5df2\u4f11\u5e02|US_close_\u5df2\u6536\u76d8|SQ_close_\u5df2\u4f11\u5e02|DS_close_\u5df2\u4f11\u5e02|ZS_close_\u5df2\u4f11\u5e02|NEWSH_close_\u5df2\u4f11\u5e02|NEWSZ_close_\u5df2\u4f11\u5e02|NEWHK_close_\u5df2\u4f11\u5e02|NEWUS_close_\u5df2\u6536\u76d8|REPO_close_\u5df2\u4f11\u5e02|UK_close_\u5df2\u4f11\u5e02|KCB_close_\u5df2\u4f11\u5e02|IT_close_\u5df2\u4f11\u5e02|MY_close_\u5df2\u4f11\u5e02|EU_close_\u5df2\u4f11\u5e02|AH_close_\u5df2\u4f11\u5e02|DE_close_\u5df2\u4f11\u5e02|JW_close_\u5df2\u4f11\u5e02|CYB_close_\u5df2\u4f11\u5e02|USA_open_\u76d8\u540e\u4ea4\u6613|USB_close_\u5df2\u6536\u76d8"],"zhishu":["Rank_A_sh","Rank_A_sh","1132","91","711","1934","169.260","-1.440","-0.844","1353133343","49280702","sh688305","sh688682"]},"mx_price":{"mx":[],"price":[]},"prec":"3525.500","version":"14"}}}`
  1198  	var kline klineData
  1199  	err := json.Unmarshal([]byte(data), &kline)
  1200  	if err != nil {
  1201  		t.Fatalf("解析json失败: %s", err)
  1202  	}
  1203  	t.Logf("kline: %+v", kline)
  1204  }