如何从JSON字符串解析数组?

时间:2017-06-15 19:21:06

标签: javascript json

我有以下C#方法:

[HttpPost]
public JsonResult GetDateBasedRegex(string date)
{
    string[] arr = CommonMethods.GetDateBasedRegex(date);

    JsonResult retVal = Json(JsonConvert.SerializeObject(retVal));

    return retVal;
}

arr包含以下内容:

enter image description here

retVal.Data包含此值:

enter image description here

这个JS调用了C#方法:

var date = $('#myDateField').val();

AjaxRequest(date, 'html', 'post', '/Common/GetDateBasedRegex', 'application/json;', function (response)
{
    var result = JSON.parse(response);
} 
);

我设置了断点并为responseresult添加了监视:

enter image description here

response稍长一些,因为它会使引号脱离,但除此之外它们的值相同。

两个变量都是单个字符串。如何将此值解析为数组?在输入这个问题时,我查看了SO的各种“建议问题”,  最相关的似乎是这样的:Javascript how to parse JSON array但我已经在做了所选答案的建议。

我尝试制作一个JS小提琴:http://jsfiddle.net/zc2o6v52/但是由于调试器添加了引号,我必须稍微调整一下这些值才能使它工作。如果我使用变量csharpJsonSerializedStringresult,则循环可以正常工作,但是当我使用response时,我的控制台中出现“未捕获的SyntaxError:Unexpected string”错误。

我做错了什么?如何从JSON字符串解析数组?

修改

C#retval的价值:

  

“[\” ^ [0-9] {9} [A-Z0-9] {0,3} $ \ “\” ^ [AZ] {1,3}([0-9] { 6} | [0-9] {9})$ \ “]”

JS response的价值:

  

“”[\ “^ [0-9] {9} [A-Z0-9] {0,3} $ \”,\“^ [AZ] {1,3}([0-9] {6} | [0-9] {9})$ \ “]”“

JS result的价值:

  

“[” ^ [0-9] {9} [A-Z0-9] {0,3} $ “” ^ [AZ] {1,3}([0-9] {6} | [0-9] {9})$ “]”

通过右键单击抓取所有这些 - >复制值,因此它们包含“包装”引号集以使其成为字符串。

C#看起来像是如何定义JS数组的。似乎response包含了一组额外的引号?

我还尝试更改我的JS以在ajax调用之外定义var result = ['',''];,然后用JSON.parse()更新其值,但之后它仍然是一个字符串。

1 个答案:

答案 0 :(得分:0)

假设这是您的API在POST请求中返回的确切值

"[\"^[0-9]{9}[A-Z0-9]{0,3}$\",\"^[A-Z]{1,3}([0-9]{6}|[0-9]{9‌​})$\"]"

这不是json,所以JSON.parse无法正常工作。您的JSON应如下所示:

[
"^[0-9]{9}[A-Z0-9]{0,3}$",
"^[A-Z]{1,3}([0-9]{6}|[0-9]{9‌​})$"
]

最好的方法是修复后端以返回正确的值(this可能指向正确的方向)。否则,您需要删除添加到结果变量的开头和结尾的引号:

var result = "\"[\"^[0-9]{9}[A-Z0-9]{0,3}$\",\"^[A-Z]{1,3}([0-9]{6}|[0-9]{9‌​})$\"]\"";
result = result.substring(1, result.length-1);
var jsonData = JSON.parse(result);
for (var i = 0; i < jsonData.length; i++) {
    console.log(jsonData[i]);
}

如果这不起作用,请检查ajax函数中的响应数据与上述有效json的不同。