JSON-запрос для параметра массива объектов WCF - PullRequest
2 голосов
/ 06 декабря 2010

Я задаю этот вопрос после поиска в Интернете ответа в течение 2 дней.

ОК, вот что:

На стороне сервера у меня есть веб-служба WCF, определенная какэто:

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

И я пытаюсь использовать этот веб-сервис с Android следующим образом:

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

Проблема:

Когда я запускаю клиент,запрос перенаправляется на сервер (у меня есть точка останова внутри функции «SaveVehicle»).

Проблема в параметре функции: «Vehicles» - этот объект (предположительно) содержит только один член -«Транспорт», который относится к типу: Список.Независимо от того, что я отправляю со стороны клиента, я получаю нулевое значение для этого внутреннего контейнера («Транспортные средства»).

Я перепробовал почти все!Я уверен, что проблема где-то в области JSONStringer ...

1 Ответ

1 голос
/ 09 декабря 2010

Нашел ответ: Определите ваши классы следующим образом:

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


namespace WebApplication1
{
 [CollectionDataContract]
 [KnownType(typeof(Vehicle))]
 public class clVehicles: List<Vehicle>
 {      
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...