如何在JSON.stringify

时间:2016-08-01 16:30:20

标签: javascript marathon

我已经获得了带有表单字段的代码,并将它们转换为适合传递给REST API的JSON字符串(特别是马拉松REST API)。问题是JSON.stringify双引号所有表单字段值,即使是那些数字,这会导致ajax调用失败。这是我的代码生成的字符串:

{"id":"basic-1","cpus":"0","mem":"32","instances":"1","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"}

mem,cpus和instances值不应该双引号,因为它们是数字。

data: JSON.stringify($('form').MytoJson());

MytoJson是一个序列化表单字段的函数。这很好。问题是JSON.stringify在键和所有值(包括数值)周围放置引号,导致ajax调用失败。

JSON.stringify函数有两个参数。第一个参数是一个replacer函数,它可以是一个函数或一个数组。考虑这个替换函数:

function replacer(key, value) {
    if (typeof value === "string") {
        return undefined;
    }
    return value;
}
JSON.stringify($('form').MytoJson(), replacer);

我想将此替换器功能修改为 not quote 数值。我想知道我是否使用HTML5表单属性来区分字符串和数字表单字段?请考虑以下表单字段:

<input id="cpus" type="number" name="cpus" value="0.1" />

如何使用此字段在更换器功能中具有 type =&#34; number&#34; 属性的事实?我想修改replacer函数,以便在表单字段的类型为number时不引用值。

3 个答案:

答案 0 :(得分:1)

为了将字符串化字符串转换回数据,您可以使用JSON.parse(stringifyedString);

例如,只需从字符串中删除引号,就不会将"5"转换为Number。它只会创建一个包含字符5的字符串。

答案 1 :(得分:1)

我不是100%,但我想这个问题是由读取表单字段的代码引起的。值 - 即它将值读取为字符串(它们是)。

您需要做的是将任何数值转换为实际的JS select * from foo where ordinal_position > (select ordinal_position from foo where name = 'John') order by ordinal_position; id | name | ordinal_position ----+---------+------------------ 7 | Will | 7 8 | Robert | 8 9 | Dave | 9 10 | Michael | 10 (4 rows) 。请尝试以下Number功能:

replacer

这应检查每个值是否为数字,如果是,则将其转换为function replacer( key, value ) { var ret = ( value === value * 1 ) ? value * 1 : value; return ret; }

答案 2 :(得分:0)

这是解决方案。我修改了replacer函数,使用HTML5表单字段类型来区分应该引用或不引用的表单字段。

function replacer(key, value) {
    //console.log(typeof($(eval('\'#' + key + '\'')).attr('type')));
    if ($(eval('\'#' + key + '\'')).attr('type') == null) {
        return value;
    }
    return parseFloat(value);
} 

然后在我的ajax代码中:

 data: JSON.stringify($('form').MytoJson(), replacer);

似乎标准“文本”输入字段的“类型”属性未定义,但在类型为“数字”时定义。我正在使用它。

如果type属性未定义,我只返回包含的值,并在JSON字符串中双引号。但是如果定义了type属性,那么我将值转换为float。它包含在未引用的JSON字符串中。这是一个有效的解决方案目前但我相信我不得不在不久的将来重新访问它。