2013-12-03 6 views
3

У меня возникла проблема связывания массива объектов пары значений ключа в MVC5. Это JSON:Связывание массива объектов в MVC

{ 
    "expiration": "2013-12-03T04:30:41.206Z", 
    "conditions": [ 
     { 
      "acl": "private" 
     }, 
     { 
      "bucket": "ryvus.upload.test" 
     }, 
     { 
      "Content-Type": "application/vnd.ms-excel" 
     }, 
     { 
      "success_action_status": "200" 
     }, 
     { 
      "key": "fc42ae8a-1f6e-4955-a669-8272ad650cb9.csv" 
     }, 
     { 
      "x-amz-meta-qqfilename": "simpleupload.csv" 
     } 
    ] 
} 

Если я пытаюсь связать условия к Dictionary<string, string> как это:

// View Model 
public class ResponseVM 
{ 
    public DateTime Expiration { get; set; } 
    public Dictionary<string, string> Conditions { get; set; } 
} 
// Controller Action 
public ActionResult MyHandler(ResponseVM s3Response) 
{ 
    //do something 
    return JSON(null); 
} 

я получаю 6 записей с ключами "0", "1",» 2 "," 3 "," 4 "," 5 "и нулевые значения. Кажется, я так близок, но я пробовал кучу разных типов без успеха, Dictionary<string, string> был лучшим, что я мог получить.

Я пропустил что-то совершенно очевидное здесь?

+1

Можете ли изменить вашу схему JSON? – LostInComputer

+1

«условия» JSON не соответствует ожидаемой схеме для словаря, поэтому вам нужно либо изменить схему JSON, либо настроить десериализацию – LostInComputer

+0

Нет, к сожалению, я не могу изменить схему JSON, но я могу изменить модель представления. – dohmoose

ответ

0
$.ajax({ 
    type: 'POST', 
    dataType: 'json', 
    data: JSON.stringify(data), 
    url: "your url", 
    contentType: 'application/json; charset=utf-8', 
    success: function (t) { 
     // code here 
    } 
}); 

Попробуйте.

Я не привязывался к словарю, но массив отлично работает.

0

Я думаю, что проблема заключается в том, что conditions структуры не может быть отображена на ключевую пару значений ... conditions структуры на самом деле массив объектов различных типов, где, например, первый объект может быть смоделирован например:

public class ACL { 
     public string acl { get; set; } 
    } 

следующий объект как:

public class Bucket { 
     public string bucket { get; set; } 
    } 

и т.д. Это не Привязываемая пара ключей значения.

Чтобы получить условия структуры для привязки к KeyValuePair<TKey, TValue> структуре вы хотите, чтобы ваш JSON, чтобы выглядеть следующим образом:

{ 
     "expiration": "2013-12-03T04:30:41.206Z", 
     "conditions": [ 
      { 
       Key: "acl", 
       Value: "private" 
      }, 
      { 
       Key: "bucket", 
       Value: "ryvus.upload.test" 
      }, 
      ... 
     ] 
    } 

EDIT: если вы не можете изменить схему JSON и вы не собираетесь писать пользовательские связующее, тогда следующая структура должна работать, но это не очень, потому что у вас есть и экземпляр NVPair для каждого элемента в conditions.

Ваши модели:

public class NVPair { 
     public string acl { get; set; } 
     public string bucket { get; set; } 
     [JsonProperty("Content-Type")] 
     public string ContentType { get; set; } 
     public string success_action_status { get; set; } 
     public string key { get; set; } 
     ... 
    } 

    public class ResponseVM 
    { 
     public DateTime Expiration { get; set; } 
     public List<NVPair> Conditions { get; set; } 
    } 

Этот путь будет отдельная деталь для каждого НВП. Но он должен связываться.

Если вы не хотите вы JsonProperty ATTRIB Json.NET в вы можете использовать DataContract как here

0

Поскольку схема JSON не может быть изменен, самый простой способ это изменить класс в соответствии с JSON.

public class ResponseVM 
{ 
    public DateTime Expiration { get; set; } 
    public List<Dictionary<string, string>> Conditions { get; set; } 
} 

Состояние - это список карт.

Кстати, цель модели просмотра (VM) - абстрагировать представление. Это не для ввода.

Смежные вопросы