2017-11-20 09:30:52 -05:00
|
|
|
/*
|
|
|
|
Copyright 2014 The Kubernetes Authors.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package runtime
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (re *RawExtension) UnmarshalJSON(in []byte) error {
|
|
|
|
if re == nil {
|
|
|
|
return errors.New("runtime.RawExtension: UnmarshalJSON on nil pointer")
|
|
|
|
}
|
|
|
|
if !bytes.Equal(in, []byte("null")) {
|
|
|
|
re.Raw = append(re.Raw[0:0], in...)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-03-25 08:03:02 -04:00
|
|
|
// MarshalJSON may get called on pointers or values, so implement MarshalJSON on value.
|
2017-11-20 09:30:52 -05:00
|
|
|
// http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go
|
|
|
|
func (re RawExtension) MarshalJSON() ([]byte, error) {
|
|
|
|
if re.Raw == nil {
|
|
|
|
// TODO: this is to support legacy behavior of JSONPrinter and YAMLPrinter, which
|
|
|
|
// expect to call json.Marshal on arbitrary versioned objects (even those not in
|
|
|
|
// the scheme). pkg/kubectl/resource#AsVersionedObjects and its interaction with
|
|
|
|
// kubectl get on objects not in the scheme needs to be updated to ensure that the
|
|
|
|
// objects that are not part of the scheme are correctly put into the right form.
|
|
|
|
if re.Object != nil {
|
|
|
|
return json.Marshal(re.Object)
|
|
|
|
}
|
|
|
|
return []byte("null"), nil
|
|
|
|
}
|
|
|
|
// TODO: Check whether ContentType is actually JSON before returning it.
|
|
|
|
return re.Raw, nil
|
|
|
|
}
|