38 lines
		
	
	
		
			812 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			38 lines
		
	
	
		
			812 B
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | package common | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"encoding/json" | ||
|  | 	"fmt" | ||
|  | 	"io/ioutil" | ||
|  | ) | ||
|  | 
 | ||
|  | // LoadJSON reads the given file and unmarshals its content. | ||
|  | func LoadJSON(file string, val interface{}) error { | ||
|  | 	content, err := ioutil.ReadFile(file) | ||
|  | 	if err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 	if err := json.Unmarshal(content, val); err != nil { | ||
|  | 		if syntaxerr, ok := err.(*json.SyntaxError); ok { | ||
|  | 			line := findLine(content, syntaxerr.Offset) | ||
|  | 			return fmt.Errorf("JSON syntax error at %v:%v: %v", file, line, err) | ||
|  | 		} | ||
|  | 		return fmt.Errorf("JSON unmarshal error in %v: %v", file, err) | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // findLine returns the line number for the given offset into data. | ||
|  | func findLine(data []byte, offset int64) (line int) { | ||
|  | 	line = 1 | ||
|  | 	for i, r := range string(data) { | ||
|  | 		if int64(i) >= offset { | ||
|  | 			return | ||
|  | 		} | ||
|  | 		if r == '\n' { | ||
|  | 			line++ | ||
|  | 		} | ||
|  | 	} | ||
|  | 	return | ||
|  | } |