Merge pull request #114 from xujianhai666/feat-boolnil
[ISSUE #113 ]Feat boolnil
diff --git a/encode.go b/encode.go
index 7ae4d05..59ce555 100644
--- a/encode.go
+++ b/encode.go
@@ -151,6 +151,13 @@
return e.encList(v)
case reflect.Map: // the type must be map[string]int
return e.encMap(v)
+ case reflect.Bool:
+ vv := v.(*bool)
+ if vv != nil {
+ e.buffer = encBool(e.buffer, *vv)
+ } else {
+ e.buffer = encBool(e.buffer, false)
+ }
default:
if p, ok := v.(POJOEnum); ok { // JavaEnum
return e.encObject(p)
diff --git a/object.go b/object.go
index 39b7385..71de3c1 100644
--- a/object.go
+++ b/object.go
@@ -389,7 +389,18 @@
if err != nil {
return nil, perrors.Wrapf(err, "decInstance->Decode field name:%s", fieldName)
}
- fldRawValue.SetBool(b.(bool))
+ v, ok := b.(bool)
+ if !ok {
+ return nil, perrors.Wrapf(err, "value convert to bool failed, field name:%s", fieldName)
+ }
+
+ if fldRawValue.Kind() == reflect.Ptr && fldRawValue.CanSet() {
+ if b != nil {
+ field.Set(reflect.ValueOf(&v))
+ }
+ } else if fldRawValue.Kind() != reflect.Ptr {
+ fldRawValue.SetBool(v)
+ }
case reflect.Float32, reflect.Float64:
num, err := d.decDouble(TAG_READ)
diff --git a/object_test.go b/object_test.go
index dd65b6f..7e3068e 100644
--- a/object_test.go
+++ b/object_test.go
@@ -480,3 +480,48 @@
t.Errorf("expect: %v, but get: %v", tuple, decObj)
}
}
+
+type BasePointer struct {
+ A *bool
+}
+
+func (t BasePointer) JavaClassName() string {
+ return "test.base.Base"
+}
+
+func TestBasePointer(t *testing.T) {
+ v := true
+ base := BasePointer{
+ A: &v,
+ }
+ doTestBasePointer(t, &base, &base)
+
+ base = BasePointer{
+ A: nil,
+ }
+ expectedF := false
+ expectedBase := BasePointer{
+ A: &expectedF,
+ }
+ doTestBasePointer(t, &base, &expectedBase)
+}
+
+func doTestBasePointer(t *testing.T, base *BasePointer, expected *BasePointer) {
+ e := NewEncoder()
+ err := e.encObject(base)
+ if err != nil {
+ t.Error(err)
+ t.FailNow()
+ }
+
+ d := NewDecoder(e.buffer)
+ decObj, err := d.Decode()
+ if err != nil {
+ t.Error(err)
+ t.FailNow()
+ }
+
+ if !reflect.DeepEqual(expected, decObj) {
+ t.Errorf("expect: %v, but get: %v", base, decObj)
+ }
+}