从Web API C#返回响应数组

时间:2017-10-19 17:41:53

标签: c# json web-services json-deserialization

我正在尝试创建一个调用其他服务并返回响应数组的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

1 个答案:

答案 0 :(得分:0)

要从Web API返回数组,您需要填充数组并将其返回foreach循环:

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

这是将JSON反序列化为POCO并获取名称列表的方法:

[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; }
}
相关问题