문제

I have a JSON array, which looks like this:

{[
  {
    "personnelId": 201,
    "occupationIds": [
      4,
      5
    ]
  },
  {
    "personnelId": 202,
    "occupationIds": [
      5
    ]
  }
]}

I'm receiving this string through a JObject in my ASP.NET Web API controller:

var jPersonnelAndOccupationIds = json["personnelAndOccupationIds"];

I've had success deserialiizing various data structures through JObject but this keeps giving a RuntimeBinderException, what data structure would be best suited for that JSON string, I've tried a lot of thing, this IMO is the most suitable List<PersonnelOccupationsVm> where PersonnelOccupationsVm looks like this:

public class PersonnelOccupationsVm
    {

        public long personnelId { get; set; }
        public List<long> occupationIds { get; set; }
    }

which I desrialize like this:

var personnelIdsAndOccupationsKvp = jPersonnelAndOccupationIds.ToObject(new List<PersonnelOccupationsVm>());

and I've tried

System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<List<PersonnelOccupationsVm>>(jPersonnelAndOccupationIds);

neither works. any ideas?

EDIT

As requested in the comments, I'm making my call like this (angular):

$http({
  method: 'POST',
  url: '/api/EnterprisePersonnelApi/SubmitOcupationalPersonnel/',
  data: JSON.stringify({ enterpriseId: enterpriseId, positionId: positionId,personnelAndOccupationIds: personnelAndOccupationIds }),
  }).success(function (data, status, headers, config) {
                      deferred.resolve(data);
  }).error(function (data, status, headers, config) {
                     deferred.reject(status);
});

and my web api action:

[System.Web.Http.HttpPost]
public CrudOperationResults SubmitOcupationalPersonnel(JObject jsonData){
dynamic json = jsonData;
var jPersonnelAndOccupationIds = json["personnelAndOccupationIds"];
var personnelIdsAndOccupations = jPersonnelAndOccupationIds.ToObject(new List<PersonnelOccupationsVm>());
.....
}

this given a RunTimeBinderexception, however when I call .ToString() while retrieving values from the JObject instance:

var jPersonnelAndOccupationIds = json["personnelAndOccupationIds"].ToString();

and (per shunty's suggestion)

var jPersonnelAndOccupationIds = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PersonnelOccupationsVm>>(jPersonnelAndOccupationIds);

this works fine, the leading and trailing curly braces were added while retieving my parameter values from JObject, calling .ToString() and deserializing it per above did the trick.

도움이 되었습니까?

해결책

I'm not a particularly proficient Json user but, using the Newtonsoft stuff I'd try something like this (cut and pasted from LINQPad):

void Main()
{
    string json = "[{ \"personnelId\": 201, \"occupationIds\": [4,5]}, {\"personnelId\": 202,\"occupationIds\": [5]}]";

    var js = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PersonnelOccupationsVm>>(json);
    js.Dump();

}

public class PersonnelOccupationsVm
{
    public int PersonnelId { get; set; }
    public List<int> OccupationIds { get; set; }

    public PersonnelOccupationsVm()
    {
        OccupationIds = new List<int>();
    }
}

Note that I had to trim the leading and trailing { } characters from the source Json.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top