Eu tenho uma lista simples de chave / valor no JSON sendo enviada de volta ao ASP.NET via POST. Exemplo:
{ "key1": "value1", "key2": "value2"}
NÃO ESTOU TENTANDO DESERIALIZAR EM OBJETOS .NET FORMAMENTE TIPOS
Eu simplesmente preciso de um dicionário antigo (Of String, String) ou equivalente (tabela de hash, Dictionary (Of String, Object), StringDictionary da velha escola - inferno, uma matriz 2D de strings funcionaria para mim.
Eu posso usar qualquer coisa disponível no ASP.NET 3.5, bem como a Json.NET popular (que eu já estou usando para serialização para o cliente).
Aparentemente, nenhuma dessas bibliotecas JSON tem essa capacidade óbvia de bater na testa imediatamente - elas são totalmente focadas na desserialização baseada em reflexão por meio de contratos firmes.
Alguma ideia?
Limitações:
- Não quero implementar meu próprio analisador JSON
- Ainda não é possível usar o ASP.NET 4.0
- Prefere ficar longe da classe ASP.NET mais antiga e obsoleta para JSON
fonte
JavaScriptSerizlizer
é usado no ASP.NET MVC e não é mais descontinuado.Respostas:
O Json.NET faz isso ...
Mais exemplos: serializando coleções com o Json.NET
fonte
dynamic
como o tipo para os valores:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
você tem que fazer algo como isto:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
Eu descobri .NET foi construído em forma de lançar a string JSON em uma
Dictionary<String, Object>
via doSystem.Web.Script.Serialization.JavaScriptSerializer
tipo no 3,5System.Web.Extensions
montagem. Use o métodoDeserializeObject(String)
.Eu me deparei com isso ao fazer uma postagem do ajax (via jquery) do tipo de conteúdo 'application / json' em um método de página .net estático e vi que o método (que tinha um único parâmetro do tipo
Object
) recebeu magicamente esse dicionário.fonte
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
seguido porDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
SomeData: ""
Para aqueles que pesquisam na Internet e se deparam com este post, escrevi um post sobre como usar a classe JavaScriptSerializer.
Leia mais ... http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Aqui está um exemplo:
fonte
Tentei não usar nenhuma implementação JSON externa, então desserializou assim:
fonte
System.Web.Script.Serialization
. Isso simplesmente funciona. Consegui até usar JSON "inválido"string json = "{'id':13, 'value': true}";
.Eu tinha o mesmo problema, então escrevi isso sozinho. Essa solução é diferenciada de outras respostas porque pode desserializar para vários níveis.
Basta enviar a string JSON para a função deserializeToDictionary , que retornará um
Dictionary<string, object>
objeto não fortemente tipado .Código antigo
Ex: Isso retornará o
Dictionary<string, object>
objeto de uma resposta JSON do Facebook.Teste
Atualizar
Minha resposta antiga funciona muito bem se não houver uma matriz na string JSON. Este ainda desserializa para a
List<object>
se um elemento é uma matriz.Basta enviar uma string JSON para a função deserializeToDictionaryOrList que retornará um
Dictionary<string, object>
objeto ou tipo não fortemente tipadoList<object>
.fonte
is
eas
operadores muito me ajudou e simplificado meu próprio código.Se você está buscando um tipo de abordagem leve e sem adição de referências, talvez esse código que acabei de escrever funcione (embora eu não possa 100% garantir robustez).
[Eu percebo que isso viola a limitação nº 1 do OP, mas tecnicamente você não escreveu, eu escrevi]
fonte
System.RunTime.Serialization
não é uma delas, infelizmente o JSON.NET depende de e, portanto, também não pode ser usado. Obrigado a Dexy pelo seu excelente trabalho, ousei aprimorá-lo um pouco para poder desserializar matrizes de matrizes, veja o código atualizado na minha resposta aqui .Eu só precisava analisar um dicionário aninhado , como
onde
JsonConvert.DeserializeObject
não ajuda. Eu encontrei a seguinte abordagem:O
SelectToken
permite cavar para o campo desejado. Você pode até especificar um caminho"x.y.z"
para avançar ainda mais no objeto JSON.fonte
System.Text.Json
Agora isso pode ser feito usando o
System.Text.Json
que está embutido em.net core 3.0
. Agora é possível desserializar JSON sem usar bibliotecas de terceiros.Também disponível no pacote nu-get System.Text.Json, se estiver usando o .Net Standard ou o .Net Framework.
fonte
System.Text.Json
é o caminho a percorrer nos dias de hoje.Mark Rendle postou isso como um comentário , queria postá-lo como resposta, já que é a única solução que funcionou até agora para retornar o sucesso e os resultados dos códigos de erro json da resposta do Google reCaptcha.
Mais uma vez obrigado, Mark!
fonte
Edit: Isso funciona, mas a resposta aceita usando o Json.NET é muito mais direta. Deixando este caso alguém precise de código somente BCL.
Não é suportado pela estrutura .NET imediatamente. Uma supervisão flagrante - nem todo mundo precisa desserializar em objetos com propriedades nomeadas. Então acabei fazendo o meu próprio:
Chamado com:
Desculpe pela mistura de C # e VB.NET…
fonte
Eu adicionei o código enviado por jSnake04 e Dasun aqui. Adicionei código para criar listas de objetos a partir de
JArray
instâncias. Possui recursão bidirecional, mas, como está funcionando em um modelo de árvore finito e fixo, não há risco de estouro de pilha, a menos que os dados sejam massivos.fonte
Adicionei uma verificação de valores nulos no JSON para a outra resposta
Eu tive o mesmo problema, então eu escrevi isso sozinho. Essa solução é diferenciada de outras respostas porque pode desserializar para vários níveis.
Basta enviar a string json para a função deserializeToDictionary , que retornará um
Dictionary<string, object>
objeto não fortemente tipado .Ex: Isso retornará o
Dictionary<string, object>
objeto de uma resposta JSON do Facebook.Nota: a cidade natal é desserializada ainda mais em um
Dictionary<string, object>
objeto.fonte
d.Value is JObject
. Você não precisa passar pela reflexão para verificar os tipos. E com ois
operador, você não precisa verificar se é nulo. Retorna false se o objeto for nulo.Parece que todas essas respostas aqui assumem que você pode obter essa pequena string de um objeto maior ... para pessoas que procuram simplesmente desserrealizar um objeto grande com esse dicionário em algum lugar do mapeamento e que estão usando o
System.Runtime.Serialization.Json
sistema DataContract, aqui está uma solução:Uma resposta em gis.stackexchange.com tinha esse link interessante . Eu tive que recuperá-lo com o archive.org, mas ele oferece uma solução praticamente perfeita: uma
IDataContractSurrogate
classe personalizada na qual você implementa exatamente seus próprios tipos. Consegui expandi-lo facilmente.Fiz várias alterações, no entanto. Como a fonte original não está mais disponível, postarei a turma inteira aqui:
Para adicionar novos tipos suportados à classe, basta adicionar sua classe, fornecer os construtores e funções corretos (veja
SurrogateDictionary
um exemplo), certificar-se de que ela seja herdadaJsonSurrogateObject
e adicionar seu mapeamento de tipo aoKnownTypes
dicionário. O SurrogateDictionary incluído pode servir como base para qualquerDictionary<String,T>
tipo em que T é qualquer tipo que desserializa corretamente.Chamá-lo é realmente simples:
Observe que, por algum motivo, essa coisa tem problemas ao usar cadeias de teclas que contêm espaços; eles simplesmente não estavam presentes na lista final. Pode ser que seja simplesmente contra especificações do json e a API que eu estava chamando foi mal implementada, lembre-se; Não sei. Enfim, resolvi isso substituindo-os por expressões regulares nos dados brutos do json e corrigindo o dicionário após a desserialização.
fonte
Dictionary<String,String>
. Sinceramente, nunca tentei desserializar tipos complexos com esse sistema.Com base nos comentários acima, tente
JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)
parece funcionar mesmo para objetos e listas complexos.
fonte
Acabei de implementar isso no RestSharp . Este post foi útil para mim.
Além do código no link, aqui está o meu código. Agora, recebo um
Dictionary
resultado quando faço algo assim:Esteja atento ao tipo de JSON que você espera - no meu caso, eu estava recuperando um único objeto com várias propriedades. No link anexado, o autor estava recuperando uma lista.
fonte
Minha abordagem desserializa diretamente o IDictionary, sem JObject ou ExpandObject no meio. O código usa o conversor, que é basicamente copiado da classe ExpandoObjectConverter encontrada no código-fonte JSON.NET, mas usando o IDictionary em vez do ExpandoObject.
Uso:
Código:
fonte
Você poderia usar o Tiny-JSON
fonte
Um pouco atrasado para o jogo, mas nenhuma das soluções acima me apontou na direção de um .NET puro e simples, nenhuma solução json.net. Então aqui está, acabou sendo muito simples. Abaixo um exemplo completo de como isso é feito com a serialização .NET Json padrão, o exemplo possui dicionário no objeto raiz e nos objetos filho.
A bala de ouro é esse gato, analise as configurações como segundo parâmetro do serializador:
Código completo abaixo:
fonte
Irritantemente, se você deseja usar os fichários de modelo padrão, parece que você precisará usar valores de índice numérico como um formulário POST.
Consulte o seguinte trecho deste artigo http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :
fonte
Eu sugeriria usar
System.Runtime.Serialization.Json
isso faz parte do .NET 4.5.Em seguida, use-o assim:
fonte
Para quem está tentando converter JSON em dicionário apenas para recuperar algum valor dele. existe uma maneira simples de usar
Newtongsoft.JSON
fonte