C# 使用newtonsoft反序列化Json文件并使用linq查询

C# 使用newtonsoft反序列化Json文件并使用linq查询,c#,parsing,json.net,json-deserialization,C#,Parsing,Json.net,Json Deserialization,我是Newtonsoft的新手,我正在尝试反序列化我的json文件,然后从中查询特定的数据点。下面是json的一个示例 [ { "reward_type": "1", "rejected": "0", "user_id": "538653", "granted": "0" }, { "reward_type": "5", "rejected": "0", "us

我是Newtonsoft的新手,我正在尝试反序列化我的json文件,然后从中查询特定的数据点。下面是json的一个示例

[
    {
        "reward_type": "1",
        "rejected": "0",
        "user_id": "538653",
        "granted": "0"
    },
    {
        "reward_type": "5",
        "rejected": "0",
        "user_id": "536345",
        "granted": "1"
    },
    {
        "reward_type": "5",
        "rejected": "0",
        "user_id": "539493",
        "granted": "1"
    }
]
我试图查询每种类型后面的值。几天来,我一直在努力研究Json.net的文档,但我很难找到反序列化文件的示例

下面是我用来解析文件的内容

InitializeComponent();
        JArray adData1 = JArray.Parse(File.ReadAllText(@"c:\ads.json"));
        using (StreamReader file = File.OpenText(@"c:\ads.json"))
        using (JsonTextReader reader = new JsonTextReader(file))
        {
            JsonSerializer serializer = new JsonSerializer();
            JArray adData2 = (JArray)serializer.Deserialize(file, typeof(JArray));

            JObject rewardType = (JObject)adData2[1];
            label1.Text = rewardType.ToString();
        }
感谢您的帮助。

建议如下:

只有当数据具有公共结构时,它才可用。如果愿意,可以替换POCO中的数据类型

POCO

public class Stuff {
    public string reward_type { get; set; }
    public string rejected { get; set; }
    public string user_id { get; set; }
    public string granted { get; set; }
}
如何使用:

public void doThings() { 
// var s = File.ReadAllText("yourfilename.json");
    var s = @"{
""reward_type"": ""1"",
""rejected"": ""0"",
""user_id"": ""538653"",
""granted"": ""0""
},
{
""reward_type"": ""5"",
""rejected"": ""0"",
""user_id"": ""536345"",
""granted"": ""1""
},
{
""reward_type"": ""5"",
""rejected"": ""0"",
""user_id"": ""539493"",
""granted"": ""1""
}";
    // [] is needed to make it recognize it as list
    var listOfStuff = JsonConvert.DeserializeObject<List<Stuff>>("["+s+"]");
    foreach (var item in listOfStuff)
    {
        Console.WriteLine(item.user_id);
    }

}
public void doThings(){
//var s=File.ReadAllText(“yourfilename.json”);
var s=@“{
“奖励类型”:“1”,
“已拒绝”:“0”,
“用户id:”“538653”“,
“已授予”:“0”
},
{
“奖励类型”:“5”,
“已拒绝”:“0”,
“用户id:”“536345”“,
“已授予”:“1”
},
{
“奖励类型”:“5”,
“已拒绝”:“0”,
“用户id:”“539493”“,
“已授予”:“1”
}";
//[]以使其识别为列表
var listofsuff=JsonConvert.DeserializeObject(“[”+s+“]”);
foreach(listOfStuff中的var项)
{
Console.WriteLine(item.user\u id);
}
}

您的最佳选择(IMHO)是反序列化为DTO/POCO对象(只包含基本属性的简单c#类),然后对其进行linq查询。我想你可以使用匿名类型。IMHO更难维护:您的JSON示例似乎缺少将其作为有效对象数组的方括号
[]
。如果括号实际上出现在整个JSON中,您应该在问题中显示它们。如果没有,那么您的JSON是无效的,这可能是您在解析它时遇到问题的部分原因。[]括号在那里,它只是JSON it 20k行,并决定对其进行采样,不过感谢您的建议。