Colección de citas famosas - Slogan de motivación - La deserialización C# de JSON recibe múltiples estructuras

La deserialización C# de JSON recibe múltiples estructuras

Cuando JavaSerializer deserializa un objeto de tipo desconocido, el valor de cada propiedad solo puede ser uno de los dos tipos siguientes: diccionario

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

{

InnerProp? =?"1",

Sub? =? objeto【】{"cadena", 2016}

} ,

{

inner prop = "2",

Sub? =? ¿Nuevo? 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);