【问题标题】:How to delete property from dynamic JObject programmatically如何以编程方式从动态 JObject 中删除属性
【发布时间】:2021-10-19 12:38:11
【问题描述】:

下面是代码

json - 只需要响应中的 JsonLookupData

{
  "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());
  

有没有办法直接从动态输入中删除属性(不想先分配给JObject)。

上面的代码给出了下面的错误

Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

【问题讨论】:

  • 示例 JSON 长什么样?
  • @DavidL 嗨,我已经更新了 JSON
  • 你为什么使用dynamic?您可以反序列化为JObjectJToken
  • 这是一个理论练习吗?使用 dynamic 作为中介而不是 JObject 是没有意义的。
  • @DavidL 这是已经用于创建所有脚本的模式,我认为通过这种模式实现这一点的唯一方法是明确删除不相关的属性,如 input.Property("BusSegmentName").Remove( );等

标签: c# .net json.net deserialization


【解决方案1】:

虽然 JObject 仍然是正确的选择,但您仍然可以使用 dynamic,只要您不使用依赖于动态调度的 lambda 表达式。

通过将 input.Properties() 的输出分配给非动态类型 (IEnumerable<dynamic>),我们可以在 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);

这个输出:

{"JsonLookupData":{"data":{"OBJ_ID":"9393","ABC":"JAJA","XYZ":"LL","AAA":"250.00"}}}

或者,您可以完全避免使用 Linq。

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);

这个输出:

{"JsonLookupData":{"data":{"OBJ_ID":"9393","ABC":"JAJA","XYZ":"LL","AAA":"250.00"}}}

用于您的示例 JSON。

【讨论】:

  • 输入的值是否会保持不变(JsonLookupData 部分)?如果我们做 JToken.FromObject(input);我会得到想要的输出吗?
  • 您希望输入保持不变吗?您在最初的问题中没有提到这些方面的任何内容。是的,您可以执行 JToken/JObject.FromObject,但同样,这些答案符合您不使用 JObject 的要求。
猜你喜欢
  • 2013-04-12
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多