2017-10-19 152 views
0

响应数组我试图创建一个Web API,它调用其他服务,并返回响应的阵列。被叫服务返回响应。我能够从被叫服务中获取单个项目。但不知道如何构建数组项并返回来自我创建的API的响应。返回从网页API C#

的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

+0

我注意到,该错误消息特别提到的内容类型'应用程序/ xml'。有效的XML要求存在单个根节点。返回的对象可能不是一个集合。如果您可以将客户端更改为请求JSON,那么可以解决问题。否则,你可能会很好地返回一个数组作为其属性的对象,而不是直接返回数组。 – StriplingWarrior

+0

@StriplingWarrior您是否要改变而不是HttpClient? – xyz

+0

号您的代码是既耗费* * Web服务('ilab_client.GetAsync(...)')和*通过消耗*客户端('返回OK(...);')。使用Web API端点的客户端正在发送HTTP请求。 Web API正在查看请求,并认为它需要将响应序列化为XML而不是JSON。这可能是由于Web请求上的标题(或缺少标题)。或者可能是由于[您的Web API应用程序配置的方式](https://stackoverflow.com/q/12629144/120955)。或者这两者的一些组合。 – StriplingWarrior

回答

0

返回从您需要填写您的阵列外返回它foreach循环网络API阵列:

var list = new List<string>(); 
foreach (...){ 
    var name = ... 
    list.Add(name); 
} 
return Ok(list.ToArray()); // or just return Ok(list); 

这是豪w ^反序列化JSONPOCO并获得名称列表:

[TestMethod] 
public void TestJsonToPocoAndGetNames() 
{ 
    const string 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"": {} 
     } 
    } 
    "; 

    var settings = new JsonSerializerSettings 
    { 
     MetadataPropertyHandling = MetadataPropertyHandling.Ignore, 
     DateParseHandling = DateParseHandling.None, 
    }; 
    var response = JsonConvert.DeserializeObject<RootJsonObject>(Json, settings); 

    var names = new List<string>(); 
    foreach (var detail in response.CrResponse.Details) 
    { 
     names.Add(detail.Name); 

     foreach (var field in detail.Fields) 
     { 
      names.Add(field.Name); 
     } 
    } 

    Assert.AreEqual(
     "Req, Project, Submitted, Rec Name", 
     string.Join(", ", names.ToArray())); 
} 

POCO类:

public class RootJsonObject 
{ 
    [JsonProperty("cr_response")] 
    public CrResponse CrResponse { get; set; } 
} 

public class CrResponse 
{ 
    [JsonProperty("cr_metadata")] 
    public CrMetadata CrMetadata { get; set; } 

    [JsonProperty("details")] 
    public Detail[] Details { get; set; } 
} 

public class CrMetadata 
{ 
} 

public class Detail 
{ 
    [JsonProperty("fields")] 
    public Field[] Fields { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

public class Field 
{ 
    [JsonProperty("name")] 
    public string Name { get; set; } 

    [JsonProperty("value")] 
    public string Value { get; set; } 
} 
+0

我们在细节和领域都有名字。我想从字段中获得名称和价值。 – xyz

+0

要访问JSON数据(不含反序列化他们到POCO类),你可能要检查这个https://stackoverflow.com/questions/6620165/how-can-i-parse-json-with-c/17842600#17842600 –

+0

使用POCO无法访问fileds下的名称和值? – xyz