Skip to content

Instantly share code, notes, and snippets.

@manjeettahkur
Created July 6, 2022 10:05
Show Gist options
  • Save manjeettahkur/785580610380403373d75522e968669b to your computer and use it in GitHub Desktop.
Save manjeettahkur/785580610380403373d75522e968669b to your computer and use it in GitHub Desktop.
unmarshal text in go programming language
package main
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"log"
)
var errUnmarshalNilLevel = errors.New("Can't unmarshal a nil *EmpType")
type EmpType int8
const (
HR EmpType = iota - 1
Designer
Coder
Manager
CEO
)
func (e EmpType) String() string {
switch e {
case HR:
return "HR"
case Designer:
return "Designer"
case Coder:
return "Coder"
case Manager:
return "Manager"
case CEO:
return "CEO"
default:
return fmt.Sprintf("LEVEL(%d)", e)
}
}
func (e *EmpType) unmarshalText(text []byte) bool {
switch string(text) {
case "hr", "HR":
*e = HR
case "designer", "DESIGNER":
*e = Designer
case "coder", "CODER":
*e = Coder
case "manager", "MANAGER":
*e = Manager
case "CEO":
*e = CEO
default:
return false
}
return true
}
func (e *EmpType) UnmarshalText(text []byte) error {
if e == nil {
return errUnmarshalNilLevel
}
if !e.unmarshalText(text) && !e.unmarshalText(bytes.ToLower(text)) {
return fmt.Errorf("Unrecognied employee code: %q", text)
}
return nil
}
type Employee struct {
Name string `json:"name"`
Code int64 `json:"code"`
Age int64 `json:"age"`
Type EmpType `json:"type"`
}
func main() {
rawJSON := []byte(`{
"name": "Manjeet Singh",
"code": 3213,
"age": 32,
"type": "coder"
}`)
var emp Employee
if err := json.Unmarshal(rawJSON, &emp); err != nil {
panic(err)
}
log.Printf("%+v", emp)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment