将c#string []转换为json

时间:2015-02-16 23:53:17

标签: javascript c# json

我有一个方法将string []返回给控制器动作,该动作返回 JsonAction ,如下所示:

// GET: Locations/Get
[HttpGet]
public async Task<JsonResult> Get(string lotNumber)
{
    var result = await this.MakeApiCall("/locations?lotNumber=" + lotNumber);

    return Json(result, JsonRequestBehavior.AllowGet);
}

在我的Javascript中,如果我这样做:

core.get(locationsApi + "?lotNumber=" + core.getParameterByName("lotNumber"), function (response) {
    var r = JSON.parse(response);

    console.log(r);
});

我看到一个与此类似的字符串:

  
    

[ “BA01A1”, “BA01A2”, “BA01A3”]

  

但是,这似乎是一个字符串,因为如果我这样做:

core.get(locationsApi + "?lotNumber=" + core.getParameterByName("lotNumber"), function (response) {
    var r = JSON.parse(response);
    var r = JSON.parse(r);

    console.log(r);
});

它实际上返回一个数组.... 如何让我的动作在开始时返回数组,或者至少返回一些我只需要解析的东西?

1 个答案:

答案 0 :(得分:2)

听起来var result =MakeApiCall返回的类型属于string类型但包含["BA01A1","BA01A2","BA01A3"],它本质上是序列化的JSON。

您可以通过鼠标移动var并查看类型是什么来确定这一点,并使用调试器查看API调用返回的实际值。

然后,当您返回带有Json(result, JsonRequestBehavior.AllowGet);的序列化JSON时,字符串将被序列化为另一个JSON表示。

基本上它是双重序列化的。

当你使用它时,客户端是result.length == 3,数组的预期长度。

    public ActionResult GetAnswer(string question)
    {               
        var answer = @"[""BA01A1"",""BA01A2"",""BA01A3""]";
        return Content(answer, "text/javascript");
    }
    // javascript result.length returns 3

当您使用Json帮助程序时,您将获得一个包含28个字符的字符串,因为Json帮助程序假定您正在传递应该序列化的对象,但问题是,您已经有一个表示为序列化字符串:

    public ActionResult GetAnswer(string question)
    {                   
        var answer = @"[""BA01A1"",""BA01A2"",""BA01A3""]";
        return Json(answer);            
    }
    // javascript result.length returns 28

这个小提琴证明了这一点。

https://dotnetfiddle.net/NCAPkh

TLDR 在您的情况下,var result可能已经是JSON序列化对象的字符串表示形式,并将其传递给Json(帮助程序,然后再次对其进行序列化。因此,客户端必须反序列化两次。

您有两个选项,要么将API调用中的字符串反序列化为C#对象列表,然后将该对象列表传递给return Json(someObject...,要么将其作为带有JSON类型的内容返回(如上所示)。