Tengo una simple lista de clave / valor en JSON que se envía de vuelta a ASP.NET a través de POST. Ejemplo:
{ "key1": "value1", "key2": "value2"}
NO ESTOY TRATANDO DE DESERIALIZAR EN OBJETOS DE .NET TIPO FUERTE
Simplemente necesito un diccionario antiguo simple (de cadena, cadena) , o algún equivalente (tabla hash, diccionario (de cadena, objeto), StringDictionary de la vieja escuela - demonios, una matriz 2D de cadenas funcionaría para mí.
Puedo usar cualquier cosa disponible en ASP.NET 3.5, así como el popular Json.NET (que ya estoy usando para la serialización al cliente).
Aparentemente, ninguna de estas bibliotecas JSON tiene esta capacidad obvia de golpear la frente desde el primer momento: están totalmente enfocadas en la deserialización basada en la reflexión a través de contratos sólidos.
¿Algunas ideas?
Limitaciones:
- No quiero implementar mi propio analizador JSON
- No puedo usar ASP.NET 4.0 todavía
- Preferiría mantenerse alejado de la clase ASP.NET más antigua y obsoleta para JSON
fuente
JavaScriptSerizlizer
se usa en ASP.NET MVC y ya no está en desuso.Respuestas:
Json.NET hace esto ...
Más ejemplos: Serialización de colecciones con Json.NET
fuente
dynamic
como tipo para los valores:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
, tiene que hacer algo como esto:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
Descubrí que .NET tiene una forma integrada de convertir la cadena JSON en un
Dictionary<String, Object>
vía través delSystem.Web.Script.Serialization.JavaScriptSerializer
tipo en elSystem.Web.Extensions
ensamblado 3.5 . Usa el métodoDeserializeObject(String)
.Me topé con esto cuando hice una publicación ajax (a través de jquery) del tipo de contenido 'application / json' a un método de página estática .net y vi que el método (que tenía un solo parámetro de tipo
Object
) recibió mágicamente este diccionario.fuente
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
seguido deDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
SomeData: ""
Para aquellos que buscan en Internet y se topan con esta publicación, escribí una publicación de blog sobre cómo usar la clase JavaScriptSerializer.
Leer más ... http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Aquí hay un ejemplo:
fuente
Intenté no usar ninguna implementación JSON externa, así que me deserialicé así:
fuente
System.Web.Script.Serialization
. Simplemente funciona Incluso pude usar JSON "inválido" comostring json = "{'id':13, 'value': true}";
.Tuve el mismo problema, así que lo escribí yo mismo. Esta solución se diferencia de otras respuestas porque puede deserializarse en múltiples niveles.
Simplemente envíe una cadena JSON para deserializar la funciónDictionary , devolverá un objeto no fuertemente tipado
Dictionary<string, object>
.Código antiguo
Ej: Esto devolverá el
Dictionary<string, object>
objeto de una respuesta JSON de Facebook.Prueba
Actualizar
Mi respuesta anterior funciona muy bien si no hay una matriz en la cadena JSON. Éste se deserializa aún más
List<object>
si un elemento es una matriz.Simplemente envíe una cadena JSON para deserializar la función ToDictionaryOrList , devolverá un objeto no fuertemente tipado
Dictionary<string, object>
oList<object>
.fuente
is
yas
operadores en gran medida me ayudó y mi propio código simplificado.Si buscas un enfoque liviano, sin referencias agregadas, tal vez este fragmento de código que acabo de escribir funcionará (aunque no puedo garantizar la solidez al 100%).
[Me doy cuenta de que esto viola la Limitación OP # 1, pero técnicamente, no lo escribiste, lo hice]
fuente
System.RunTime.Serialization
no es una de ellas, desafortunadamente JSON.NET depende de y por lo tanto tampoco se puede usar. Gracias Dexy por su excelente trabajo, me atreví a mejorarlo un poco para poder deserializar las matrices de matrices, vea el código actualizado en mi respuesta aquí .Solo necesitaba analizar un diccionario anidado , como
donde
JsonConvert.DeserializeObject
no ayuda Encontré el siguiente enfoque:El
SelectToken
te permite cavar hasta el campo deseado. Incluso puede especificar una ruta"x.y.z"
para descender más al objeto JSON.fuente
System.Text.Json
Esto ahora se puede hacer usando el
System.Text.Json
que está integrado en.net core 3.0
. Ahora es posible deserializar JSON sin usar bibliotecas de terceros.También disponible en el paquete nu-get System.Text.Json si se usa .Net Standard o .Net Framework.
fuente
System.Text.Json
Es el camino a seguir en estos días.Mark Rendle publicó esto como un comentario , quería publicarlo como respuesta ya que es la única solución que ha funcionado hasta ahora para devolver el éxito y los resultados de los códigos de error json de la respuesta reCaptcha de Google.
Gracias de nuevo, Mark!
fuente
Editar: Esto funciona, pero la respuesta aceptada usando Json.NET es mucho más sencilla. Dejar este en caso de que alguien necesite un código solo BCL.
No es compatible con .NET Framework de fábrica. Una deslumbrante supervisión: no todos necesitan deserializarse en objetos con propiedades con nombre. Así que terminé rodando el mío:
Llamado con:
Perdón por la combinación de C # y VB.NET ...
fuente
He agregado el código enviado por jSnake04 y Dasun aquí. He agregado código para crear listas de objetos a partir de
JArray
instancias. Tiene una recursión bidireccional, pero como funciona en un modelo de árbol fijo finito, no hay riesgo de desbordamiento de la pila a menos que los datos sean masivos.fuente
Agregué una verificación de valores nulos en el JSON a la otra respuesta
Tuve el mismo problema, así que escribí esto yo mismo. Esta solución se diferencia de otras respuestas porque puede deserializarse en múltiples niveles.
Simplemente envíe una cadena json para deserializar la funciónDictionary; devolverá un objeto no fuertemente tipado
Dictionary<string, object>
.Ej: Esto devolverá el
Dictionary<string, object>
objeto de una respuesta JSON de Facebook.Nota: la ciudad natal se deserializa aún más en un
Dictionary<string, object>
objeto.fuente
d.Value is JObject
. No tiene que pasar por la reflexión para verificar los tipos. Y con elis
operador no necesita verificar nulo. Devuelve falso si el objeto es nulo.Parece que todas estas respuestas aquí solo asumen que puedes sacar esa pequeña cadena de un objeto más grande ... para las personas que buscan simplemente deserealizar un objeto grande con un diccionario de este tipo en algún lugar dentro del mapeo, y que están usando el
System.Runtime.Serialization.Json
sistema DataContract, aquí está una solución:Una respuesta en gis.stackexchange.com tenía este interesante enlace . Tuve que recuperarlo con archive.org, pero ofrece una solución bastante perfecta: una costumbre
IDataContractSurrogate
clase en la que implementas exactamente tus propios tipos. Pude expandirlo fácilmente.Sin embargo, hice un montón de cambios. Como la fuente original ya no está disponible, publicaré toda la clase aquí:
Para agregar nuevos tipos compatibles a la clase, solo necesita agregar su clase, asignarle los constructores y funciones correctos (vea
SurrogateDictionary
un ejemplo), asegúrese de que heredeJsonSurrogateObject
y agregue su asignación de tipos alKnownTypes
diccionario. El SurrogateDictionary incluido puede servir como base para cualquierDictionary<String,T>
tipo en el que T sea cualquier tipo que se deserialice correctamente.Llamarlo es realmente simple:
Tenga en cuenta que, por alguna razón, esto tiene problemas para usar cadenas de teclas que contienen espacios; simplemente no estaban presentes en la lista final. Podría ser simplemente que está en contra de las especificaciones json y la API que estaba llamando estaba mal implementada, eso sí; No se. De todos modos, resolví esto regex-reemplazándolos con guiones bajos en los datos json sin procesar y arreglando el diccionario después de la deserialización.
fuente
Dictionary<String,String>
. Sinceramente, nunca intenté deserializar tipos complejos con este sistema.Según los comentarios anteriores, intente
JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)
parece funcionar incluso para objetos complejos y listas.
fuente
Acabo de implementar esto en RestSharp . Esta publicación me fue útil.
Además del código en el enlace, aquí está mi código. Ahora obtengo algunos
Dictionary
resultados cuando hago algo como esto:Tenga en cuenta el tipo de JSON que espera: en mi caso, estaba recuperando un solo objeto con varias propiedades. En el enlace adjunto, el autor estaba recuperando una lista.
fuente
Mi enfoque se deserializa directamente a IDictionary, sin JObject o ExpandObject en el medio. El código usa el convertidor, que básicamente se copia de la clase ExpandoObjectConverter que se encuentra en el código fuente JSON.NET, pero usando IDictionary en lugar de ExpandoObject.
Uso:
Código:
fuente
Podrías usar Tiny-JSON
fuente
Un poco tarde para el juego, pero ninguna de las soluciones anteriores me señaló en la dirección de una solución pura y simple .NET, no json.net. Así que aquí está, terminó siendo muy simple. Debajo de un ejemplo completo de cómo se hace con la serialización .NET Json estándar, el ejemplo tiene un diccionario tanto en el objeto raíz como en los objetos secundarios.
La bala de oro es este gato, analiza la configuración como segundo parámetro para el serializador:
Código completo a continuación:
fuente
De manera bastante molesta, si desea usar las carpetas de modelo predeterminadas, parece que tendrá que usar valores de índice numérico como un formulario POST.
Vea el siguiente extracto de este artículo http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :
fuente
Sugeriría usar
System.Runtime.Serialization.Json
eso es parte de .NET 4.5.Entonces úsalo así:
fuente
Para cualquiera que esté tratando de convertir JSON a diccionario solo por recuperar algún valor. hay una manera simple de usar
Newtongsoft.JSON
fuente