【发布时间】:2017-10-19 17:41:52
【问题描述】:
我正在尝试创建一个调用其他服务并返回响应数组的 Web API。被调用的服务返回响应。我能够从被调用的服务中获取单个项目。但不确定如何构建项目数组并作为我正在创建的 API 的响应返回。
从服务返回的 JSON 看起来像
{
"cr_response": {
"details": [{
"name": "Req",
"fields": [{
"value": "Prj0\r\nPrj1",
"name": "Project"
},
{
"value": "October 13, 2017 14:18",
"name": "Submitted"
},
{
"value": "John",
"name": "Rec Name"
}
]
}],
"cr_metadata": {}
}
}
POCO 类看起来像
public class Field
{
public string value { get; set; }
public string name { get; set; }
}
public class Detail
{
public string name { get; set; }
public List<Field> fields { get; set; }
}
public class CrMetadata
{
}
public class CrResponse
{
public List<Detail> details { get; set; }
public CrMetadata cr_metadata { get; set; }
}
public class RootObject
{
public CrResponse cr_response { get; set; }
}
以下是调用服务并从服务中检索响应的代码
var response = await iLab_client.GetAsync(uri);
var datafile = await response.Content.ReadAsStringAsync();
var returnDataObj = JsonConvert.DeserializeObject<DTO.RootObject>(datafile);
foreach (var form in returnDataObj.cr_response.details)
{
name_response = form.name;
return Ok(name_response);
}
在这里,我可以从详细信息中访问名称,但不确定如何从字段中访问所有名称和值并将其构造在数组中。并将其作为 JSON 响应发送。 我试过了
foreach (var form in returnDataObj.cr_response.details)
{
var id_response = form.fields;
return Ok(id_response);
}
但它会抛出类似
的错误<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
The 'ObjectContent`1' type failed to serialize the response body for content
type 'application/xml; charset=utf-8'.
</ExceptionMessage>
System.InvalidOperationException
【问题讨论】:
-
我注意到错误消息特别提到了内容类型
application/xml。有效的 XML 要求有一个根节点。返回的对象可能不能是集合。如果您可以将客户端更改为请求 JSON,则可能会解决问题。否则,您最好返回一个将数组作为其属性之一的对象,而不是直接返回数组。 -
@StriplingWarrior 你要求改变而不是 HttpClient 吗?
-
没有。您的代码既使用 Web 服务 (
ilab_client.GetAsync(...)) 也被 客户端使用 (return Ok(...);)。使用您的 Web API 端点的客户端正在发送 HTTP 请求。 Web API 正在查看请求并认为它需要将响应序列化为 XML 而不是 JSON。这可能是由于 Web 请求中的标头(或没有标头)所致。或者可能是由于the way your Web API application is configured。或者这两者的某种组合。
标签: c# json web-services json-deserialization