Package jsonextract is a library for extracting JSON from a given source, such as string, bytes, file, and io.Reader, providing methods for editing and evaluating json values. One of the cases to use this library is to extract all json strings in a scraped HTML page
JSONExtract require Go v1.14 or higher
$ GO111MODULE go get github.com/tamboto2000/jsonextract/v3You can extract jsons from string, []byte, file, and an io.Reader
// from string
jsons, err := jsonextract.FromString(str)
// from []byte
jsons, err := jsonextract.FromBytes(byts)
// from file path
jsons, err := jsonextract.FromFile(path)
// from io.Reader
jsons, err := jsonextract.FromReader(reader)There's 7 different kinds of JSON:
- Object
- Array
- String
- Integer
- Float
- Boolean
- Null
You can get JSON kind by calling JSON.Kind()
jsons, err := jsonextract.FromBytes(byts)
if err != nil {
panic(err.Error())
}
for _, json := range jsons {
// string
if json.Kind() == jsonextract.String {
// print string value
fmt.Println(json.String())
}
// int
if json.Kind() == jsonextract.Integer {
// print integer value, returned integer value is int64
fmt.Println(json.Integer())
}
// float
if json.Kind() == jsonextract.Float {
// print float value, returned float is float64
fmt.Println(json.Float())
}
// and so on...
}Getter methods, such as JSON.String(), JSON.Integer(), JSON.Float(), etc., will panic if JSON kind did not match the getter methods, for example, when trying to get string value from JSON with kind of Integer. JSON with kind of Null didn't have getter method
Value inside JSON can be modified by setter methods, such as JSON.SetStr(), JSON.SetInt(), etc.
// integer
if json.Kind() == jsonextract.Integer {
json.EditInt(23)
}
// string
if json.Kind() == jsonextract.String {
json.EditStr("Hello World!")
}
// and so on...Setter methods will panic if JSON kind did not match with setter method, for example, trying to call JSON.SetInt() to JSON with kind of String. JSON with kind of Null didn't have setter method
Json object represented as JSON with kind of Object. For adding a new value, call JSON.AddField() with param key as json field name, and val for the value
json.AddField("name", "Franklin Collin Tamboto")
json.AddField("email", "[email protected]")
json.AddField("id", 1)
i := 1
json.AddField("id", &i)
json.AddField("qty", int32(23))
json.AddField("userId", uint(2))
json.AddField("height", float32(3.2))Just like package encoding/json, map and struct will be marshaled as json object. map keys need to be type string or an integer type, otherwise panic will occur
type User struct {
ID int `json:"id"`
Name string `json:"name"`
// field name will be used as json field name if json tag is not present,
// so this field will be marshaled as "Email":"value"
Email string
}
// add struct
json.AddField("user", User{
ID: 1,
Name: "Franklin Collin Tamboto",
Email: "[email protected]",
})
// add map
json.AddField("item", map[interface{}]interface{}{
"Name": "ROG Zephyrus M",
"Qty": 23,
123: 456,
})
// add value with int as key
json.AddField(123, 456)
// add value with uint8 as key
json.AddField(uint8(432), "123")To delete an item from object, call JSON.DeleteField() with param key as json field name for deletion. key must be string or an integer type, otherwise panic will occur. JSON.DeleteField() return true if item is exist, otherwise false will returned
// delete with string key
if json.DeleteField("user") {
fmt.Println("item deleted")
} else {
fmt.Println("item not exist")
}
// delete with integer key
if json.DeleteField(int32(123)) {
fmt.Println("item deleted")
} else {
fmt.Println("item not exist")
}To access all contained items, call JSON.Object(), this method will return map[interface{}]*JSON
fields := json.Object()
for _, f := range fields {
// do something...
}Get contained items count by calling JSON.Len()
fmt.Println("len:", json.Len())Json array represented as JSON with kind of Array. For adding a new value, call JSON.AddItem() with param val. Will panic if val is not valid json value
json.AddItem("Hello world")Get contained items count by calling JSON.Len()
fmt.Println("len:", json.Len())To delete an item, call json.DeleteItem() with param i as array index
if json.DeleteItem(2) {
fmt.Println("item deleted")
} else {
fmt.Println("item is not exist")
}Get all items by calling JSON.Array()
items := json.Array()
for _, item := range items {
// do something
}When an item is edited inside JSON, the contained raw json will automatically re-generated.
DO NOT PERFORM ANY SETTER OR GETTER METHODS CONCURRENTLY
See Documentation for more information. There's also some examples you can look up to
MIT