Como obter um dataset Json criado dinamicamente no controlador MVC 3?

Ok, estou usando o MVC 3 e é ótimo para desselular um dataset JSON em um object fortemente tipado que é passado para a ação do meu controlador. Infelizmente não encontrei uma solução para um caso mais dynamic.

O built-in de desserialização e classs do Json tem suporte para um conjunto de propriedades “indefinido”? Por exemplo, vamos dizer que tenho alguns dados fixos como nome e idade, mas também quero passar uma lista de sorting criada dinamicamente, onde o usuário poderia inserir (ou selecionar) um filme e definir um valor de sorting em uma tabela.

A estrutura de dados do modelo poderia ser algo assim:

public class UserRatings { public string Name { get; set; } public int Age { get; set; } public Dictionary Ratings { get; set; } } 

Mas supondo que meu dataset Json se pareça com isso de javascript:

 var data = { Name: name, Age: age, Ratings: rating }; 

Onde a variável de sorting é um object construído dinamicamente que consiste no nome (ou identificação) do filme como chave e sorting como número. Naturalmente, a desserialização disso na ação do controlador não será bem-sucedida, pois não entende o mapeamento de Classificações para o object de dictionary bastante complexo. Mas existe uma coleção Json genérica que eu poderia usar em vez de Ratings como um formato intermediário?

Eu tentei fazer o object Ratings uma string Json em javascript e apenas enviando uma string para baixo, mas não consigo encontrar uma “fábrica” ​​ou algo que possa fazer uma estrutura Json em C # que eu possa iterar para obter os dados. As classs Json e JsonResult não me ajudam a esse respeito, parece. Basicamente, como posso usar o suporte Json embutido no MVC para fazer meu próprio de-serialização em algum object genérico da coleção Json?

Você poderia usar JavaScriptSerializer ou DataContractSerializer com alguns ActionFilters. Eles são muito flexíveis

Veja minha resposta Passando o object json dynamic para o controlador C # MVC usando basicamente um tipo dynamic e um ValueProviderFactory é a maneira mais limpa de desserializar o Json para algo mais dynamic.

Há outra opção que eu prefiro usar para ser mais limpa … (eliminamos a etapa de obter dados do stream de solicitação)

Aqui está uma amostra de código

 Cat catObj = new Cat(); if (TryUpdateModel(catObj)) { //do stuff } else { //invalid input } 

O TryUpdateModel reside no namespace do controlador e, portanto, não há necessidade de adicionar nenhuma referência adicional.

Se você apenas precisar do Json enviado como parte da solicitação, poderá obtê-lo usando o seguinte bloco de código (você também pode obtê-lo em Request.Form )

 using (StreamReader reader = new StreamReader(Request.InputStream)) { var inputJson = reader.ReadToEnd(); }