| /* |
| 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 |
| } |
| |
| // Marshal may get called on pointers or values, so implement MarshalJSON on value. |
| // 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 |
| } |