2017-10-19 8 views
0

J'essaie de créer une API Web qui appelle l'autre service et renvoie un tableau de réponse. Le service appelé renvoie la réponse. Je suis en mesure d'obtenir l'article individuel du service appelé. Mais je ne sais pas comment construire un tableau d'éléments et revenir en réponse à l'API que je crée.Retour Tableau de réponse de l'API Web C#

Le JSON retour de service ressemble

{ 
"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": {} 
} 
} 

Et la classe POCO ressemble

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; } 
} 

est sous le code pour appeler le service et la récupération de la réponse des services

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); 
} 

Ici, je peux accéder au nom à partir des détails, mais je ne sais pas comment puis-je accéder au tout le nom et la valeur des champs et le construire dans un tableau. Et l'envoyer comme une réponse JSON. J'ai essayé comme

  foreach (var form in returnDataObj.cr_response.details) 
      { 
       var id_response = form.fields; 
       return Ok(id_response); 
      } 

Mais il jette l'erreur comme

<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

Je remarque que le message d'erreur mentionne spécifiquement le type de contenu 'application/xml'. Un code XML valide nécessite un seul nœud racine. Il est possible que l'objet renvoyé ne puisse pas être une collection. Si vous pouvez changer le client pour demander JSON à la place, cela pourrait résoudre le problème. Sinon, vous pourriez bien retourner un objet avec le tableau comme une de ses propriétés au lieu de renvoyer le tableau directement. – StriplingWarrior

+0

@StriplingWarrior Demandez-vous de changer au lieu de HttpClient? – xyz

+0

Non. Votre code consomme à la fois * un service Web ('ilab_client.GetAsync (...)') et * est consommé par * un client ('return Ok (...);'). Le client qui utilise votre point de terminaison d'API Web envoie une requête HTTP. L'API Web examine la demande et pense qu'elle doit sérialiser la réponse au format XML plutôt que JSON. Cela peut être dû à un en-tête (ou à l'absence d'en-tête) dans la requête Web. Ou cela peut être dû à [la façon dont votre application API Web est configurée] (https://stackoverflow.com/q/12629144/120955). Ou une combinaison de ces deux. – StriplingWarrior

Répondre

0

Pour revenir tableau à partir API Web que vous devez remplir votre tableau et le retourner à l'extérieur boucle foreach:

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

Ceci est ho w désérialiser JSON-POCO et obtenir la liste des noms:

[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())); 
} 

cours 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

Nous avons un nom dans les détails ainsi que dans les champs. Je veux obtenir le nom et la valeur des champs. – xyz

+0

Pour accéder aux données JSON (sans les désérialiser dans les classes POCO), vous pouvez vérifier ce https://stackoverflow.com/questions/6620165/how-can-i-parse-json-with-c/17842600#17842600 –

+0

POCO ne puis-je pas accéder au nom et aux valeurs sous Fileds? – xyz