Tengo un caso en el que la llamada de red recuperará la cadena json. y es como
"{"PdfSearchCTTestExperiment": 0, "_ecs": {"PdfSearchCTTestExperiment": "PX-100967-1-13"}}"Básicamente, la respuesta tendrá dos tipos de valores, uno es una cadena y otro es dictionary<cadena, cadena>.
Y necesito deserilizar los pares de valores clave internos y externos en el diccionario. Esta es mi manera de hacerlo:
var outerDict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(ss); string innerDictString = JsonConvert.SerializeObject(outerDict["_ecs"]); var innerDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(innerDictString );Funciona, pero no creo que sea la forma eficiente. Básicamente, debido al sistema de tipos, necesito hacer como dos análisis más. ¿Alguna forma mejor de lograr esto? ¡Gracias!
Puede crear un modelo para su respuesta, algo como:
public class ResponseModel { public int PdfSearchCTTestExperiment{get;set;} [JsonProperty("_ecs")] public Dictionary<string,string> Ecs{get;set;} }y deserializarlo así:
var responseModel = JsonConvert.DeserializeObject<ResponseModel>(ss); Console.WriteLine(responseModel.Ecs["PdfSearchCTTestExperiment"]);json
{ "PdfSearchCTTestExperiment": 0, "key1": "value1", "key2": "value2", "_ecs": { "PdfSearchCTTestExperiment": "PX-100967-1-13" } }La forma más fácil de llegar a lo que realmente necesita es el análisis json, en lugar de la deserialización.
var jsonObject = JObject.Parse(json);prueba
string key1= (string) jsonObject["key1"]; string pdfSearchCTTestExperiment= (string)jsonObject["_ecs"]["PdfSearchCTTestExperiment"];si aún desea deserializar en 2 diccionarios en lugar de analizar, deberá crear una clase
public class Dictionaries { public Dictionary<string, string> OuterDict { get; set; } public Dictionary<string, string> InnerDict { get; set; } }código
var jsonObject = JObject.Parse(json); var dictionaries = new Dictionaries{ OuterDict = jsonObject.Properties().Where(o => o.Name != "_ecs").ToDictionary(o => o.Name, o => (string)o.Value), InnerDict = jsonObject.Properties().Where(o => o.Name == "_ecs").FirstOrDefault().Value.ToObject<Dictionary<string, string>>() };prueba
string key1=dictionaries.OuterDict["key1"]; string pdfSearchCTTestExperiment= dictionaries.InnerDict["PdfSearchCTTestExperiment"];¿Se adapta Dictionary<string,object> a sus necesidades? Luego puede volver a convertir al tipo necesario a través de la reflexión