private void validateNumeric(String where, JsonToken token) throws IOException {
        if (token == JsonToken.VALUE_NUMBER_FLOAT || token == JsonToken.VALUE_NUMBER_INT || token == JsonToken.VALUE_NULL) {
            return; // ok
        }
        if (token == JsonToken.VALUE_STRING) {
            String input = parser.getValueAsString();
            try {
                double d = decodeNumberString(input);
                return;
            } catch (NumberFormatException e) {
                throw new InvalidConstantTensorException(parser, String.format("Inside '%s': cell value '%s' is not a number", where, input));
            }
        }
        throw new InvalidConstantTensorException(parser, String.format("Inside '%s': cell value is not a number (%s)", where, token.toString()));
    }
Tensor labels are always strings. Labels for a mapped dimension can be any string,
but those for indexed dimensions needs to be able to be interpreted as integers, and,
additionally, those for indexed bounded dimensions needs to fall within the dimension size.
config-model/src/main/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidator.java