【问题标题】:Is there an easier way to access Json Object values in Jarray有没有更简单的方法来访问 Jarray 中的 Json 对象值
【发布时间】:2019-06-14 11:30:42
【问题描述】:

好的,所以我刚刚开始学习 c#,我正在重新创建一个我用 python 制作的程序,它使用 api 来提取学生记录并使用 json 数据来创建新的用户帐户。

现在我知道 python 有很多“魔法”功能,而且它的设计目的是快速和简单。但是我必须有一种更简单的方法来访问 c# 中的 json 对象值

一个 Python 示例,为我只需要入学日期 = 今天的学生过滤掉我的数据

for st in student:  # for every student, if DateOfEntry = today add to csv file
if (st['DateOfEntry'])[:10].strip() == today.strftime('%d/%m/%Y'):

现在在 c# 中从我在 Jarray 上在线找到的资源中访问我需要做这样的事情

JArray students = JArray.Parse(response.Content);

foreach (JObject student in students.Children<JObject>())
    {
    foreach (JProperty studentProperty in student.Properties())
        {
        string propertyName = studentProperty.Name;
        if (propertyName.Equals("DateOfEntry"))
            {
            string propertyValue = (string)studentProperty.Value;
            //Console.WriteLine("Name: {0}, Value: {1}", propertyName, propertyValue);
            if (propertyValue.Equals(today.ToString("dd/MM/yyyy HH:mm:ss")))
                {
                }

现在我想通过挑选某些关键值(即姓名、身份证、年份等)来创建学生详细信息列表

在 python 中,就像将以下内容放在前面的 if 语句中一样简单

stu = (
        st['Forename']+' '+ st['Surname']+'<br><br>',
      )
    newstudents.append(stu)

但是对于我当前的 c# 设置,我想我必须重新迭代 studentporoperty 或添加更多 if 语句来检索我想要的属性值。

这感觉很笨拙而且不正确,如果我学到了什么“如果感觉不对,那么你可能做错了”

我想知道此时将 JSON 解析为 JArray 是否正确,或者是否有更简单的方法来访问键和值?

【问题讨论】:

  • 您真的使用的是 C# 语言版本 2.0 吗?您是指 .Net Core 2.0 还是 .Net Standard 2.0?
  • 简单的方式是将整个字符串反序列化为对象,而不是逐个访问。您可以编写一个简单的var students=JsonConvert.DeserializeObject&lt;Student[]&gt;(json) 来获取一个强类型的学生对象数组。日期没有格式,它们是二进制值。
  • 您可以通过复制 JSON 示例并将其粘贴到带有 Edit &gt; Paste Special &gt; Paste JSON as Classes 的 C# 文件中来轻松生成必要的类。
  • @phuzi 我使用的是 .netcore 2.2 所以可能不是 c#2.0 我认为它们是一样的,我的错
  • @Panagiotis Kanavos 很酷,不知道你能做到,但是每个学生都有大量的 json 数据,我只需要说 5-12 个部分

标签: c# json json.net


【解决方案1】:

您是否尝试过使用 Json NewtonSoft,它将大大简化您的 Json 的反序列化以及学生列表的使用。 Linq 在您的情况下会很方便,但它仅适用于 C# 3.0。

我给你一个使用NewtonSoft的简单例子(拿Nuget包)。

class Program
{
    static void Main(string[] args)
    {
        MyClass object1 = new MyClass(1, "A", new DateTime(2019, 1, 1));
        MyClass object2 = new MyClass(2, "B", new DateTime(2019, 1, 2));

        List<MyClass> myList = new List<MyClass>();
        myList.Add(object1);
        myList.Add(object2);

        string json = JsonConvert.SerializeObject(myList);
        List<MyClass> objectAfterJson = JsonConvert.DeserializeObject<List<MyClass>>(json);

        int id = objectAfterJson[0].Id;
    }
}

class MyClass
{
    public int Id;
    public string Name;
    public DateTime Date;

    public MyClass(int id, string name, DateTime date)
    {
        Id = id;
        Name = name;
        Date = date;
    }
}

【讨论】:

  • 我确实尝试过这个,但是由于我没有将它设置为一个类它不起作用,我在 newtonsoft 上看到了很多其他示例,但它只是没有点击我的大脑,也没有必要为它创建一个类,因为我已经习惯了 Python……不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2017-10-14
  • 2015-01-08
  • 2019-09-06
相关资源
最近更新 更多