【问题标题】:How to read json string in c#如何在 C# 中读取 json 字符串
【发布时间】:2020-07-06 14:53:32
【问题描述】:

我正在尝试手动解析 json 中的字符串。这就是我的 json 的样子

{{
  "dbViews": [
    {
      "viewID": 0,
      "viewColumns": [
        {
          "dbTitle": "ColNmid",
          "viewTitle": "string",
          "activated": true,
          "activatedLabel": "Afficher"
        },
        {
          "dbTitle": "ColNmdelete",
          "viewTitle": "string",
          "activated": true,
          "activatedLabel": "Afficher"
        }
      ]
    }
  ],
  "AddViewName": "test"
}}

这就是我试图阅读它的方式。

            UserViewDto User = new UserViewDto();
            dynamic obj = JObject.Parse(json);
            User.id = obj.dbViews.viewID;
            User.viewName = obj.AddViewName;

            foreach (var item in obj.viewColumns)
            {
                if (obj.dbTitle == "ColNmid")
                {
                    User.ColNmid = obj.viewTitle;
                }
            }

我只能读取 addViewName,我似乎无法访问 viewID 或 viewColumn。

更新:

在 cmets 之后,我显然错过了第二个数组。这是我的新代码女巫工作

            UserViewDto User = new UserViewDto();
            dynamic obj = JObject.Parse(json);

            User.viewName = obj.AddViewName;

            foreach (var view in obj.dbViews)
            {
                User.id = view.viewID;              

                foreach (var item in view.viewColumns)
                {
                    if (item.dbTitle == "ColNmid")
                    {
                        User.ColNmid = item.viewTitle;
                    }
                }
            }

【问题讨论】:

  • 这不是有效的 json 并且 dbviews 是一个数组。
  • dbViews 是数组,而不是对象。另外,为什么不 JsonConvert.DeserializeObject<UserViewDto>(); 或其他与您的 json 匹配的模型?
  • 请阅读How to Ask“我似乎无法访问 viewID 或 viewColumn” 是什么意思,究竟会发生什么?
  • 是的,foreach() 可以,但您需要另一个。正如@Guru 所说,dbViews 本身也是一个数组。
  • witch [原文如此] 我不想写 让 Visual Studio 为您完成 编辑 菜单 -> 选择性粘贴 -> 将 Json 粘贴为类

标签: c# json asp.net-mvc


【解决方案1】:

您有问题的 json 无效(开始和结束时有额外的 {})。看来您正在使用 Newtonsoft 的 Json.NET 库。通常的方法是创建与您的 json 结构相对应的模型并对其进行反序列化:

public class Root
{
    [JsonProperty("dbViews")]
    public List<DbView> DbViews { get; set; }

    [JsonProperty("AddViewName")]
    public string AddViewName { get; set; }
}

public class DbView
{
    [JsonProperty("viewID")]
    public long ViewId { get; set; }

    [JsonProperty("viewColumns")]
    public List<ViewColumn> ViewColumns { get; set; }
}

public class ViewColumn
{
    [JsonProperty("dbTitle")]
    public string DbTitle { get; set; }

    [JsonProperty("viewTitle")]
    public string ViewTitle { get; set; }

    [JsonProperty("activated")]
    public bool Activated { get; set; }

    [JsonProperty("activatedLabel")]
    public string ActivatedLabel { get; set; }
} 

var result = JsonConvert.DeserializeObject<Root>();

你不需要在你的类中包含所有属性,你可以只包含需要的。

如果您不想创建自定义模型并想在您的情况下遍历 JObject 属性,您可以这样做:

var jObj = JObject.Parse(json);

foreach(var view in jObj["dbViews"]) // dbViews is an array
{
    Console.WriteLine(view["viewID"]);
    foreach (var viewColumn in view["viewColumns"]) // viewColumns is an array
    {
        Console.WriteLine(viewColumn["dbTitle"]);
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2011-07-17
    相关资源
    最近更新 更多