documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go
func (tv *TagValue) UnmarshalJSON(json []byte) error {
	escapeLevel := 0 // How many bytes after '_'.
	var parsedByte byte

	// Might need fewer bytes, but let's avoid realloc.
	result := bytes.NewBuffer(make([]byte, 0, len(json)-2))

	for i, b := range json {
		if i == 0 {
			if b != '"' {
				return errors.Errorf("expected '\"', got %q", b)
			}
			continue
		}
		if i == len(json)-1 {
			if b != '"' {
				return errors.Errorf("expected '\"', got %q", b)
			}
			break
		}
		switch escapeLevel {
		case 0:
			if b == '_' {
				escapeLevel = 1
				continue
			}
			result.WriteByte(b)
		case 1:
			switch {
			case b == '_':
				result.WriteByte('_')
				escapeLevel = 0
			case b == '.':
				result.WriteByte(':')
				escapeLevel = 0
			case b >= '0' && b <= '9':
				parsedByte = (b - 48) << 4
				escapeLevel = 2
			case b >= 'A' && b <= 'F': // A-F
				parsedByte = (b - 55) << 4
				escapeLevel = 2
			default:
				return errors.Errorf(
					"illegal escape sequence at byte %d (%c)",
					i, b,
				)
			}
		case 2:
			switch {
			case b >= '0' && b <= '9':
				parsedByte += b - 48
			case b >= 'A' && b <= 'F': // A-F
				parsedByte += b - 55
			default:
				return errors.Errorf(
					"illegal escape sequence at byte %d (%c)",
					i, b,
				)
			}
			result.WriteByte(parsedByte)
			escapeLevel = 0
		default:
			panic("unexpected escape level")
		}
	}
	*tv = TagValue(result.String())
	return nil
}
func (tv *TagValue) UnmarshalJSON(json []byte) error {
	escapeLevel := 0 // How many bytes after '_'.
	var parsedByte byte

	// Might need fewer bytes, but let's avoid realloc.
	result := bytes.NewBuffer(make([]byte, 0, len(json)-2))

	for i, b := range json {
		if i == 0 {
			if b != '"' {
				return errors.Errorf("expected '\"', got %q", b)
			}
			continue
		}
		if i == len(json)-1 {
			if b != '"' {
				return errors.Errorf("expected '\"', got %q", b)
			}
			break
		}
		switch escapeLevel {
		case 0:
			if b == '_' {
				escapeLevel = 1
				continue
			}
			result.WriteByte(b)
		case 1:
			switch {
			case b == '_':
				result.WriteByte('_')
				escapeLevel = 0
			case b == '.':
				result.WriteByte(':')
				escapeLevel = 0
			case b >= '0' && b <= '9':
				parsedByte = (b - 48) << 4
				escapeLevel = 2
			case b >= 'A' && b <= 'F': // A-F
				parsedByte = (b - 55) << 4
				escapeLevel = 2
			default:
				return errors.Errorf(
					"illegal escape sequence at byte %d (%c)",
					i, b,
				)
			}
		case 2:
			switch {
			case b >= '0' && b <= '9':
				parsedByte += b - 48
			case b >= 'A' && b <= 'F': // A-F
				parsedByte += b - 55
			default:
				return errors.Errorf(
					"illegal escape sequence at byte %d (%c)",
					i, b,
				)
			}
			result.WriteByte(parsedByte)
			escapeLevel = 0
		default:
			panic("unexpected escape level")
		}
	}
	*tv = TagValue(result.String())
	return nil
}
func ( tv * TagValue ) UnmarshalJSON ( json [ ] byte ) error { escapeLevel := 0 // How many bytes after '_'. var parsedByte byte // Might need fewer bytes, but let's avoid realloc. result := bytes . NewBuffer ( make ( [ ] byte , 0 , len ( json ) - 2 ) ) for i , b := range json { if i == 0 { if b != '"' { return errors . Errorf ( " \" " , b ) } continue } if i == len ( json ) - 1 { if b != '"' { return errors . Errorf ( " \" " , b ) } break } switch escapeLevel { case 0 : if b == '_' { escapeLevel = 1 continue } result . WriteByte ( b ) case 1 : switch { case b == '_' : result . WriteByte ( '_' ) escapeLevel = 0 case b == '.' : result . WriteByte ( ':' ) escapeLevel = 0 case b >= '0' && b <= '9' : parsedByte = ( b - 48 ) << 4 escapeLevel = 2 case b >= 'A' && b <= 'F' : // A-F parsedByte = ( b - 55 ) << 4 escapeLevel = 2 default : return errors . Errorf ( " " , i , b , ) } case 2 : switch { case b >= '0' && b <= '9' : parsedByte += b - 48 case b >= 'A' && b <= 'F' : // A-F parsedByte += b - 55 default : return errors . Errorf ( " " , i , b , ) } result . WriteByte ( parsedByte ) escapeLevel = 0 default : panic ( " " ) } } * tv = TagValue ( result . String ( ) ) return nil }
// UnmarshalJSON unmarshals JSON strings coming from OpenTSDB into Go strings
// by applying the inverse of what is described for the MarshalJSON method.
UnmarshalJSON unmarshals JSON strings coming from OpenTSDB into Go strings by applying the inverse of what is described for the MarshalJSON method .