2017-10-19 86 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