C# 使用newtonsoft反序列化Json文件并使用linq查询
我是Newtonsoft的新手,我正在尝试反序列化我的json文件,然后从中查询特定的数据点。下面是json的一个示例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
[
{
"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行,并决定对其进行采样,不过感谢您的建议。