【问题标题】:JSON data read as array of single characters读取为单个字符数组的 JSON 数据
【发布时间】:2017-10-10 18:32:54
【问题描述】:

我遇到了一些问题,希望有人遇到过这个问题并知道发生了什么。

我正在调用我们的 WebAPI 以使用 $resource 获取数据

(angularJS 控制器代码)

 Controller.service.common.GetData.get({pubPolyData: objData}, function 
 (Response) {
                // success 
               Do stuff...

            }

(AngularJS 服务)

GetData: $resource(myURL, {}),

通过字符串类型的 APIController(这是一个 c# 可继承对象)。

我正在使用System.Net.WebClient();,它调用response = client.DownloadString(theURI);,其中response 是返回给AngularJS 的内容。

这是 ApiController 中返回的内容

{"ObjectName":[{"ID":"123456","FormalName":"LastName, FirstName","SearchName":null,"Number":"xx-123-456789","OfficeName":"Some Office INC","Code":"987654","CompanyCode":"852","StateAbbr":"MN"}]}

...但正如您所见,Controller.service.common.GetTheData.get({sendData: objData}, function (myResponse)myResponse 所返回的调用实际上是正确的数据,但每个字符都拆分为一个数组

Response       [object (Resource)]
   _proto_     [object (Resource)]
   $promise    [object (Promise)]
   $resolved   true
   [0]         "{"
   [1]         "\"
   [2]         "O"
   [3]         "b"
   [4]         "j"
   [5]         "e"
   [0]         "c"
   [1]         "t"
   [2]         "N"
   [3]         "a"
   [4]         "m"
   [5]         "e"
   [0]         ":"
   [1]         "["
   [2]         "{"
   [3]         "I"
   [4]         "D"
   [5]         ":"

...等

…我在这里错过了什么?

【问题讨论】:

  • 这是无法回答的。你的 JSON 看起来不错。它的内容标题呢?接收这个 JSON 的代码是什么?您的客户端代码将其误解为字符数组,但您没有将其包含在问题中。哎呀,也向我们展示您的服务器端代码。就目前而言,我投票结束。
  • "通过字符串类型的 APIController。"这是什么意思?

标签: c# angularjs asp.net-web-api


【解决方案1】:

所以实际的问题是在 HttpResponseMessage(本地控制器)类型的控制器中获取 HttpResponseMessage(来自远程 WebAPI)并试图将其传递回 $resource...no bueno!

我实际上所做的是将本地控制器更改为键入 SimpleResponse..."T" 是您要填充的模型。是的,不幸的是,如果您出于某种原因需要像这样调用您的遥控器,您将不得不在本地控制器上复制模型。

一旦我有了它,我就反序列化了对象并将 SimpleResponse 返回给 $resource,一切都很开心!!

public class MyControllerController : ApiController {
    public SimpleResponse<DataModel> GET(string _inData) {            
        DataModel data = new DataModel();


            try {
                System.Net.WebClient client = new System.Net.WebClient();

                String Domain = CallToGetValueFromWebConfig("WEBAPIURL", "value");
                String theURI = String.Format("{0}api/ApIControllerName?_inData={1}", Domain, _inData);


                client.BaseAddress = theURI;
                client.UseDefaultCredentials = true;

                var json = client.DownloadString(theURI);

                data = JsonConvert.DeserializeObject<DataModel>(json, new JsonSerializerSettings() {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });



            } catch (Exception ex) {
                EventLogging.AddExceptionEvent(EventLogging.EventID.WebApiDataGet, "Some error text", ex);
            }

        return new SimpleResponse<DataModel> { Data = data}; 
    }
}
}

【讨论】:

    【解决方案2】:

    您可以使用Newtonsoft

    string json = "{\"ObjectName\":[{\"ID\":\"123456\",\"FormalName\":\"LastName, FirstName\",\"SearchName\":null,\"Number\":\"xx-123-456789\",\"OfficeName\":\"Some Office INC\",\"Code\":\"987654\",\"CompanyCode\":\"852\",\"StateAbbr\":\"MN\"}]}";
    var response = Newtonsoft.Json.Linq.JToken.Parse(json)["ObjectName"];
    

    这将返回

    [
      {
        "ID": "123456",
        "FormalName": "LastName, FirstName",
        "SearchName": null,
        "Number": "xx-123-456789",
        "OfficeName": "Some Office INC",
        "Code": "987654",
        "CompanyCode": "852",
        "StateAbbr": "MN"
      }
    ]
    

    【讨论】:

    • 这个问题用 Angular 标记,所以可以安全地假设他们正在解析 JSON 客户端,而不是服务器端。
    • 不,实际上我说我是通过一个 ApiController 获取数据的,它是一个 C#.net 可继承对象。我确实尝试了上面的解决方案,但“var response”为空?
    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 2021-01-21
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多