2010-12-06 15 views
2

Je pose cette question après avoir effectué une recherche sur le Web pendant 2 jours.Demande JSON pour le paramètre de tableau d'objets WCF

OK, voici la chose:

Dans le côté serveur j'ai un WebService WCF, défini comme ceci:

namespace HelloRest 
{ 
[System.ServiceModel.ServiceContract] 
public interface IHelloRest 
    { 
    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     UriTemplate = "SaveVehicle", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     ResponseFormat = WebMessageFormat.Json, 
     RequestFormat = WebMessageFormat.Json)] 
    string SaveVehicle(clVehicles vehicles); 
    } 
} 

namespace HelloRest 
{ 
    public class HelloRestService : IHelloRest 
{ 
    public string SaveVehicle(clVehicles vehicles) 
    { 
    ... 
    } 
} 
} 


namespace WebApplication1 
{ 

    [Serializable] 
    [DataContract] 
    public class clVehicles 
    { 
     [DataMember] 
     public List<Vehicle> Vehicles { get; set; } 
    } 
} 


namespace WebApplication1 
{ 

    [Serializable] 
    [DataContract] 
    public class Vehicle 
    { 

     [DataMember(Name = "year")] 
     public int Year 
     { 
      get; 
      set; 
     } 

     [DataMember(Name = "plate")] 
     public string Plate 
     { 
      get; 
      set; 
     } 

     [DataMember(Name = "make")] 
     public string Make 
     { 
      get; 
      set; 
     } 

     [DataMember(Name = "model")] 
     public string Model 
     { 
      get; 
      set; 
     } 
    }  
} 

Et Im essayant de consommer ce webservice avec Android, de cette façon:

HttpPost request = new HttpPost(Consts.URL + "/SaveVehicle"); 
request.setHeader("Accept", "application/json"); 
request.setHeader("Content-type", "application/json"); 

JSONStringer v = new JSONStringer(); 
v.object(); 
v.key("Vehicles"); 
v.object(); 
v.key("plate").value(plate); 
v.key("make").value(make); 
v.key("model").value(model); 
v.key("year").value(Integer.parseInt(year.toString())); 
v.endObject(); 
v.endObject(); 
JSONArray arr = new JSONArray(); 
arr.put(v); 

JSONStringer vehicle = new JSONStringer(); 
vehicle.object(); 
vehicle.key("vehicles").value(arr); 
vehicle.endObject(); 

StringEntity entity = new StringEntity(vehicle.toString()); 
request.setEntity(entity); 
// Send request to WCF service 
DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpResponse response = httpClient.execute(request); 

le problème:

Quand je lance le client, le reque st est transmis au serveur (j'ai un point d'arrêt à l'intérieur de la fonction "SaveVehicle") correctement.

Le problème est avec le paramètre de la fonction: "véhicules" - cet objet (supposé) ne contient qu'un seul membre - "Véhicules", qui est de type: Liste. Peu importe ce que j'envoie du côté client, je reçois une valeur nulle pour ce conteneur interne ("Véhicules").

J'ai essayé presque tout! Je suis sûr que le problème est quelque part dans la région JSONStringer ...

Répondre

1

trouvé une réponse: Définir vos classes comme suit:

namespace WebApplication1 
{ 
[KnownType(typeof(Vehicle))] 
[DataContract] 
public class Vehicle 
{ 
} 
} 


namespace WebApplication1 
{ 
[CollectionDataContract] 
[KnownType(typeof(Vehicle))] 
public class clVehicles: List<Vehicle> 
{  
} 
}