2013-12-21 168 views
0

我有一个JSON阵列,它看起来像这样:反序列化JSON字符串到C#

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

我通过我的ASP.NET Web API控制器JObject收到此字符串:

var jPersonnelAndOccupationIds = json["personnelAndOccupationIds"]; 

我已经成功通过JObject去各种各样的数据结构,但这一直给出RuntimeBinderException,什么数据结构将最适合那个JSON字符串,我已经尝试了很多东西,这个IMO是最合适的List<PersonnelOccupationsVm>其中PersonnelOccupationsVm看起来是这样的:

public class PersonnelOccupationsVm 
    { 

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

我desrialize这样的:

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

,我已经试过

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

既不作品。有任何想法吗?

编辑

正如意见中的要求,我正在做我的电话是这样的(角度):

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

和我的Web API操作:

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

这给定一个RunTimeBinderexception,但是当我从JObject实例中调用.ToString()时:

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

和(每shunty的建议)

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

这工作得很好,而来自JObject retieving我的参数值添加的开头和结尾的大括号,呼吁.ToString()每上述反序列化它的伎俩。

+1

你显示的是无效的JSON。 JSON数组应该以'['开始并以']结尾。在你的例子中,似乎有一些包裹'{'和'}'。另外你在这里使用的'json'变量是什么:'json [“personnelAndOccupationIds”]'?它从何而来?它看起来像你试图反序列化JSON字符串两次。 –

+0

同意JSON无效。尝试http://jsonlint.com/。 – tia

+0

@DarinDimitrov看到我的编辑。 –

回答

0

我不是特别精通的Json用户,但使用Newtonsoft的东西,我会尝试这样的事情(剪切和粘贴从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>(); 
    } 
} 

注意,我不得不削减的领先和从源Json中拖动{}字符。