A continuación se muestra el código
json: solo quiero JsonLookupData en la respuesta
{ "LookupType": "ABC", "BusSegmentName": "Test", "PolcyObjectId": "999", "JsonLookupData": { "data": { "OBJ_ID": "9393", "ABC": "JAJA", "XYZ": "LL", "AAA": "250.00" } } } public new dynamic input { get; set; } //initialization input = JsonConvert.DeserializeObject(jsonInput.ToString()); //trying to remove all attributes except JsonLookupData input.Properties().Where (x => !x.Name.Equals("JsonLookupData")).ToList().ForEach(x => x.Remove());
¿Hay alguna forma de eliminar las propiedades directamente desde la entrada dinámica (no quiero asignarlo primero a JObject)?
el código anterior está dando el siguiente error
Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type
Si bien un JObject sigue siendo la opción correcta, aún puede usar dynamic
siempre que no use expresiones lambda que dependan del despacho dinámico.
Al asignar la salida de input.Properties()
a un tipo no dinámico ( IEnumerable<dynamic>
), podemos realizar operaciones en una expresión lambda.
input = JsonConvert.DeserializeObject(jsonInput.ToString()); IEnumerable<dynamic> props = input.Properties(); props.Where(x => !x.Name.Equals("JsonLookupData")).ToList().ForEach(x => x.Remove()); string xx = JsonConvert.SerializeObject(input);
Esto da como resultado:
{"JsonLookupData":{"data":{"OBJ_ID":"9393","ABC":"JAJA","XYZ":"LL","AAA":"250.00"}}}
Alternativamente, puede evitar Linq por completo.
input = JsonConvert.DeserializeObject(jsonInput); // create a separate tracking collection so that we // do not modify the collection we are iterating var propsToRemove = new List<JProperty>(); foreach (var prop in input.Properties()) { if (!prop.Name.Equals("JsonLookupData")) { propsToRemove.Add(prop); } } propsToRemove.ForEach(x => x.Remove()); string xx = JsonConvert.SerializeObject(input);
Esto da como resultado:
{"JsonLookupData":{"data":{"OBJ_ID":"9393","ABC":"JAJA","XYZ":"LL","AAA":"250.00"}}}
para su muestra JSON.