2013-12-21 246 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中拖動{}字符。