从 JSON 对象数组中过滤特定值的反序列化结果?

问题描述 投票:0回答:2

我从 API 获取 JSON 响应:

"table1": [
    {
        "abc": "test",
        "def": "test1"
    },
    {
        "abc": "test2",
        "def": "User1"
    }       
]

绑定到

public List<object>? table1 { get; set; }

我想使用 Linq/Lamda 获取 User1。 下面返回0条记录:

    var filteredList = table1
        .Where(item => 
        item.GetType().GetProperty("def",BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase)?.GetValue(item)?.ToString() is "User1" or "User2")
.ToList();

有什么问题吗

c# linq json.net
2个回答
0
投票

我不明白你为什么在这里尝试使用 System.Reflection 和模式匹配

is

借助 JSON 库(例如 Newtonsoft.Json)来读取/解析对象的字段:

using Newtonsoft.Json.Linq;

string[] filters = new string[] {"User1", "User2"};
var filteredList = table1
    .Where(item => filters.Contains(JObject.FromObject(item)?.SelectToken("def").ToString()))
    .ToList();

或者,如果您知道

Table
对象的结构,则可以定义并使用模型类而不是
object
类型:

public class Root
{
    public List<Table>? table1 { get; set; }
}

public class Table
{
    public string Abc { get; set; }
    public string Def { get; set; }
}
string[] filters = new string[] {"User1", "User2"};
var filteredList = table1
    .Where(item => filters.Contains(item.Def))
    .ToList();

0
投票

问题在于“System.Object”没有公开序列化框架可以绑定的任何属性。它们不会存在用于过滤。

一个简单的选择是使用

dynamic
类型,示例中的序列化框架明确支持该类型(通过
ExpandoObject
):

public List<dynamic> table1 { get; set; }

那么您的过滤器列表可能如下所示:

    var filteredList = table1
        .Where(item =>
            "User1".Equals(item.def)
            || "User2".Equals(item.def))
        .ToList();

这只会最小程度地改变你的例子。

最好使用显式类型定义来避免后期绑定问题,例如未接收到

def
值,但如果您专门尝试后期绑定到数据,那么
dynamic
应该适合您的需要。

© www.soinside.com 2019 - 2024. All rights reserved.