La deserialización C# de JSON recibe múltiples estructuras
Además, escribí una clase auxiliar simple que debería ahorrarle el problema de la capa por capa para cada uno. La clase auxiliar se ha optimizado ligeramente. Los diccionarios y las matrices se procesan por separado y no es necesario recorrer las claves del diccionario.
Al usarlo, solo necesita completar la "ruta completa" del atributo al que desea acceder, y los miembros de la matriz usan la forma de []. Si apunta a una propiedad que no existe, devuelve nulo.
Ejemplo varresult = nontypeobjectreader. getvalue(obj, "prop. niños[0].innerPropeller"
¿Clase? Lector de objetos sin tipo
{
¿Público? ¿Estático? ¿Objeto? GetValue(Objeto ?obj,?String?Expression)
{
¿Pila? =?GetExpQueue(expresión);
Si? >
{
¿Devolución?
}
retorno?null
}
¿Objeto privado? ? GetValueInner(?object? /p>
{
if?(stack.count?>?0)
{
var? pila. .dequeue();
if (!Tup.Item2)
var?=?obj? <String, ?Object>
si ?(dictObj?! =?null?&&?DictionaryObject.ContainsKey(tup.Item1))
{
Return? GetValueInner(dict obj[tup.Item1],? pila);
}
}
¿Y si?(!(obj? ? diccionario<String,?object>))
{
var?=? dentro de parse(tup.item 1);
var?=?obj?as?array;
if?(arrObj?!=?null?&? arrObj?> ? índice)
{
Return ? GetValueInner(arr obj. GetValue(índice), ? pila);
}
}
return null
}
return obj
}
¿estático? tupla< cadena,? getExpQueue(cadena?expresión)
var?rtnStack=?new? String,? bool & gt& gt();
StringBuilder? nombreprop? =?¿Nuevo? StringBuilder();
var? siguienteSaveIsIndex? =?Falso;
¿Para qué? (var?cursor?=?0;?cursor?<?expresión.
longitud;? Cursor++)
{
var? ¿ch? =?Expresión [cursor];
Si? (ch?!=?'.'?& amp& amp?ch?!=?'['?& amp& amp?ch?!=?']')
{
nombreprop. Append(ch);
}
¿Y si? ¿si? (propName.length?>?0)
{
rtnStack. enqueue(new ? tupla<String, ?bool>(propName.ToString(), ?nextSaveIsIndex));
propName. clear();
siguienteSaveIsIndex? =?ch? ==?'[';
}
}
¿Si? (propName.length?>?0)
{
rtnStack. enqueue(new ? Tuple<String, ?bool>(propName.ToString(), ?false);
}
Devuelve ?rtnStack
}
}Código de prueba:
var? =? Serializador de JavaScript();
var =? ?=?1,
Prop2?=?"Hola",
¿Niño? Nuevo【】
{
Nuevo p>
{
InnerProp? =?"1",
Sub? =? objeto【】{"cadena", 2016}
} ,
{
inner prop = "2",
Sub? =? ¿Nuevo? p>} p>
};
var?jsonStr?=?serialize(raw obj);
var?obj?=?serializer Object(jsonStr)
var? valor? =?NonTypeObjectReader. GetValue(obj, "child[0].sub[1]";
Aserción(valor? ? int? && amp? = =?2016);