in tensorflow_serving/util/json_tensor.cc [680:737]
Status AddValueToFeature(const rapidjson::Value& val,
const string& feature_name, Feature* feature) {
switch (val.GetType()) {
case rapidjson::kNullType:
return errors::InvalidArgument(
"Feature: ", feature_name,
" has element with unexpected JSON type: ", JsonTypeString(val));
case rapidjson::kFalseType:
case rapidjson::kTrueType:
if (!IsFeatureOfKind(*feature, Feature::KindCase::kInt64List)) {
return IncompatibleFeatureKindError(feature_name, *feature);
}
feature->mutable_int64_list()->add_value(val.GetBool() ? 1 : 0);
break;
case rapidjson::kObjectType:
if (!IsValBase64Object(val)) {
return errors::InvalidArgument(
"Feature: ", feature_name,
" has element with unexpected JSON type: ", JsonTypeString(val));
}
if (!IsFeatureOfKind(*feature, Feature::KindCase::kBytesList)) {
return IncompatibleFeatureKindError(feature_name, *feature);
}
TF_RETURN_IF_ERROR(JsonDecodeBase64Object(
val, feature->mutable_bytes_list()->add_value()));
break;
case rapidjson::kArrayType:
return errors::InvalidArgument(
"Feature: ", feature_name,
" has element with unexpected JSON type: ", JsonTypeString(val));
case rapidjson::kStringType:
if (!IsFeatureOfKind(*feature, Feature::KindCase::kBytesList)) {
return IncompatibleFeatureKindError(feature_name, *feature);
}
feature->mutable_bytes_list()->add_value(val.GetString(),
val.GetStringLength());
break;
case rapidjson::kNumberType:
if (val.IsDouble()) {
if (!IsFeatureOfKind(*feature, Feature::KindCase::kFloatList)) {
return IncompatibleFeatureKindError(feature_name, *feature);
}
feature->mutable_float_list()->add_value(val.GetFloat());
} else {
if (!IsFeatureOfKind(*feature, Feature::KindCase::kInt64List)) {
return IncompatibleFeatureKindError(feature_name, *feature);
}
if (!val.IsInt64() && val.IsUint64()) {
return errors::InvalidArgument(
"Feature: ", feature_name,
" has uint64_t element. Only int64_t is supported.");
}
feature->mutable_int64_list()->add_value(val.GetInt64());
}
break;
}
return Status::OK();
}