【问题标题】:How to filter JArray?如何过滤 JArray?
【发布时间】:2022-06-11 00:50:51
【问题描述】:

我有一个如下的JArray,如何通过“to”和“from”过滤它?,我尝试了以下方法:

JArray ja_test = (JArray)(ja_chat
    .Children<JArray>()
    .Where(o => (int)o["data"]["from"] == 49 && (int)o["data"]["to"] == 10));

但它会抛出:

无法转换 WhereEnumerableIterator'1[Newtonsoft.Json.Linq.JArray] 类型的对象 输入Newtonsoft.Json.Linq.JArray

如何做到这一点?

[
  {
    "data": {
      "to": 49,
      "from": 50,
      "text": "Hi Dev",
      "files": [],
      "msg_id": "__chat__",
      "datetime": "2022-05-22 12:23:14"
    }
  },
  {
    "data": {
      "to": 49,
      "from": 10,
      "text": "Hello Dev",
      "files": [],
      "msg_id": "__chat__",
      "datetime": "2022-05-22 12:23:14"
    }
  }
]

【问题讨论】:

  • 这本质上是一个错字:您正在投射.Where(...) 的结果,而不是ja_chat。为此,您需要((JArray)ja_chat)
  • @DiplomacyNotWar 不,这不是错字
  • 不是错字吗?之后怎么样了?您是否尝试从查询结果(.Where)中具体化(构建列表或数组)?你真的需要JArray 结果吗?
  • 您正在尝试将 LINQ 查询强制转换为 JArray - 因为它没有意义而失败。你应该做什么取决于你想对查询结果做什么
  • 那里 - 我编辑了您的问题,以便更容易理解@DiplomacyNotWar 所说的内容。请注意,它与原来的完全相同,添加的() 是可选的,不会影响任何内容。

标签: c# json .net-core json.net


【解决方案1】:

你必须首先解析 json。试试这个,它会返回一个 JObject 数组

var JArray jaChat = JArray.Parse(json);

JObject[] jaTest = jaChat.Where( o =>
        (int)o["data"]["from"] == 10 && (int)o["data"]["to"] == 49)
        .Select(o=> (JObject)o).ToArray();

或者如果你想要一个 JArray,你必须将 JObject[] 转换为 JArray

    JArray jaTest1 = JArray.FromObject(jaTest);

   // or from json

    JArray jaTest = JArray.FromObject( jaChat.Where(o =>
    (int)o["data"]["from"] == 10 && (int)o["data"]["to"] == 49));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2014-08-11
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多