Skip to content

Commit

Permalink
add sjson library in chapter 4.8-json
Browse files Browse the repository at this point in the history
  • Loading branch information
danny committed Jun 1, 2023
1 parent 789387f commit 5597fb7
Showing 1 changed file with 208 additions and 0 deletions.
208 changes: 208 additions & 0 deletions content/chapter 4/4.8-json.md
Original file line number Diff line number Diff line change
Expand Up @@ -639,3 +639,211 @@ results := gjson.GetMany(json, "name.first", "name.last", "age")
مقدار بازگشتی یک  `[]Result` است، که همیشه دارای دقیقاً همان تعداد آیتم‌هایی است که مسیرهای ورودی دارند.



### 4.8.6 کتابخانه SJSON

در واقع SJSON یک کتابخانه‌ای است که یک راه بسیار سریع و ساده برای تنظیم یک value در یک سند json ارائه می دهد. در بخش قبلی فقط می‌توانستیم مقادیر موجود در یک سند json بازخوانی کنیم ولی به کمک sjson می توانیم مقادیر مورد نظر را در یک سند json وارد کرده یا به روزرسانی و حذف دهیم.

### 4.8.6.1 راه اندازی و نصب SJSON


برای شروع استفاده از SJSON باید آن را نصب کنید و `go get` را اجرا کنید:


```sh
$ go get -u github.com/tidwall/sjson
```

با این کار کتابخانه نصب می شود.

### 4.8.6.2 Set a value
-----------
دستور Set مقدار یا value ای را برای path مشخص شده اجرا می کند. یک path در یک dot syntax مشخص می‌شود، مانند 'name.last' یا 'age'. در این عملکرد انتظار می‌رود که ساختار کلی json صحیح و valid باشد. در صورت اشکال در ساختار json فایل و Invalid بودن آن، حالت panic رخ نمی‌دهد، اما ممکن است نتایج غیرمنتظره‌ای را برگرداند. البته pathهای نامعتبر ممکن است ایجاد خطا کند.
به عنوان مثال کد زیر:

```go
package main

import "github.com/tidwall/sjson"

const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}`

func main() {
value, _ := sjson.Set(json, "name.last", "Anderson")
println(value)
}
```

خروجی به شکل زیر خواهد بود:

```json
{"name":{"first":"Janet","last":"Anderson"},"age":47}
```

### 4.8.6.3 Path syntax
-----------

در واقع path یا مسیر مجموعه ای از کلیدها است که با یک نقطه از هم جدا شده اند. کاراکترهای dot و colon را می توان با کاراکتر ``\`` به راحتی escape کرد.



```json
{
"name": {"first": "Tom", "last": "Anderson"},
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "James", "last": "Murphy"},
{"first": "Roger", "last": "Craig"}
]
}
```
```
"name.last" >> "Anderson"
"age" >> 37
"children.1" >> "Alex"
"friends.1.last" >> "Craig"
```


از کلید `-1` می توان برای افزودن یک مقدار به آرایه موجود استفاده کرد:

```
"children.-1" >> appends a new value to the end of the children array
```

معمولاً از کلیدهای عددی برای اصلاح آرایه ها استفاده می شود، اما می توان با استفاده از کاراکتر دو نقطه، یک کلید شی عددی را اجرا کرد:

```json
{
"users":{
"2313":{"name":"Sara"},
"7839":{"name":"Andy"}
}
}
```

همینطور colon path به صورت زیر است:

```
"users.:2313.name" >> "Sara"
```

### 4.8.6.4 Supported types
---------------

در کتابخانه SJSON تقریباً هر نوع متغیر یا type ای پشتیبانی می شود:

```go
sjson.Set(`{"key":true}`, "key", nil)
sjson.Set(`{"key":true}`, "key", false)
sjson.Set(`{"key":true}`, "key", 1)
sjson.Set(`{"key":true}`, "key", 10.5)
sjson.Set(`{"key":true}`, "key", "hello")
sjson.Set(`{"key":true}`, "key", []string{"hello", "world"})
sjson.Set(`{"key":true}`, "key", map[string]interface{}{"hello":"world"})
```


هنگامی که یک type شناسایی نمی شود، SJSON به رمزگذاری `encoding/json` باز می گردد.

### 4.8.6.5 مثال SJSON
--------

در این بخش به بررسی چند مثال از SJSON می پردازیم:

وارد کردن یک مقدار در یک json document خالی.

```go
value, _ := sjson.Set("", "name", "Tom")
println(value)

// Output:
// {"name":"Tom"}
```

وارد کردن یک مقادیر تو در تو یا nested در یک json document خالی.
```go
value, _ := sjson.Set("", "name.last", "Anderson")
println(value)

// Output:
// {"name":{"last":"Anderson"}}
```

وارد کردن مقدار جدید در سند:
```go
value, _ := sjson.Set(`{"name":{"last":"Anderson"}}`, "name.first", "Sara")
println(value)

// Output:
// {"name":{"first":"Sara","last":"Anderson"}}
```

بروزرسانی و آپدیت یک سند:
```go
value, _ := sjson.Set(`{"name":{"last":"Anderson"}}`, "name.last", "Smith")
println(value)

// Output:
// {"name":{"last":"Smith"}}
```

وارد کردن مقدار آرایه جدید:

```go
value, _ := sjson.Set(`{"friends":["Andy","Carol"]}`, "friends.2", "Sara")
println(value)

// Output:
// {"friends":["Andy","Carol","Sara"]
```

اضافه کردن مقدار جدید به انتهای آرایه با استفاده از گزینه `1-` :
```go
value, _ := sjson.Set(`{"friends":["Andy","Carol"]}`, "friends.-1", "Sara")
println(value)

// Output:
// {"friends":["Andy","Carol","Sara"]
```

اضافه کردن مقدار جدید به انتهای آرایه و null کردن سایر سلول‌های آرایه که بین انتهای آرایه و آخرین سلولی که دارای مقدار مشخص بوده است :
```go
value, _ := sjson.Set(`{"friends":["Andy","Carol"]}`, "friends.4", "Sara")
println(value)

// Output:
// {"friends":["Andy","Carol",null,null,"Sara"]
```

حذف کردن یک مقدار:

```go
value, _ := sjson.Delete(`{"name":{"first":"Sara","last":"Anderson"}}`, "name.first")
println(value)

// Output:
// {"name":{"last":"Anderson"}}
```

حذف کردن مقادیر آرایه ای:

```go
value, _ := sjson.Delete(`{"friends":["Andy","Carol"]}`, "friends.1")
println(value)

// Output:
// {"friends":["Andy"]}
```

حذف کردن انتهای آرایه:

```go
value, _ := sjson.Delete(`{"friends":["Andy","Carol"]}`, "friends.-1")
println(value)

// Output:
// {"friends":["Andy"]}
```

0 comments on commit 5597fb7

Please sign in to comment.