【问题标题】:Deserializing the json without using jObject [closed]在不使用 jObject 的情况下反序列化 json [关闭]
【发布时间】:2020-11-20 08:56:38
【问题描述】:

我需要反序列化我的 json,我不应该在这里使用 jobject 类。我尝试使用 NewtonSoft Deserialize,但未能获得所需的结果。我总是得到空值。下面是适用于 jObject 解析的代码。请让我知道如何在不使用 jObject 的情况下进行反序列化。

带有 jObject 的代码

public DataClassifier GetCsvSchema1()
        {
            Uri schemaPath = new Uri("https://text.z16.web.core.windows.net/");
            var schemaUri = new Uri(schemaPath, "DataFileCsvConfig.json");            
            using var client = new WebClient();
            var json = client.DownloadString(schemaUri);
            var schemajson = JsonSchema.FromJsonAsync(json);
            var root = JObject.Parse(json);
            var guestValues = root["DataClassifier"]["Classes"].ToObject<List<DataClass>>();
            DataClassifierSettings gfd = new DataClassifierSettings();
            gfd.Classes = guestValues;
            DataClassifier dsc = new DataClassifier(gfd);
            return dsc;
        }

我在第 4 行得到的 json 示例如下:

{
  "DataClassifier": {
    "Classes": [
      {
        "Type": "Dput",
        "SubType": "VitalSigns",
        "Format": "csv",
        "DataFileIncludePatterns": [
          "**/italsigns*.csv"
        ],
        "TableSchema": {
          "Fields": [
            {
              "Name": "Time",
              "Type": "DateTime",
              "Source": [
                "TimeStamp"
              ]
            },
            {
              "Name": "FrameCounter",
              "Type": "int"
            },
            {
              "Name": "State",
              "Type": "int"
            },
            {
              "Name": "RPM",
              "Type": "double"
            },
            {
              "Name": "Distance",
              "Type": "double"
            },
            {
              "Name": "RespirationConfidence",
              "Type": "double"
            },
            {
              "Name": "HeartBPM",
              "Type": "double"
            },
            {
              "Name": "HeartDistance",
              "Type": "double"
            },
            {
              "Name": "HeartConfidence",
              "Type": "double"
            },
            {
              "Name": "MovementPowerSlow",
              "Type": "double",
              "Source": [
                "MovementPowerSlow",
                "movement_power_slow"
              ]
            },
            {
              "Name": "MovementPowerFast",
              "Type": "double",
              "Source": [
                "MovementPowerFast",
                "movement_power_fast"
              ]
            },
            {
              "Name": "MovementPowerStart",
              "Type": "double",
              "Source": [
                "MovementPowerStart",
                "movement_power_start"
              ]
            },
            {
              "Name": "MovementPowerEnd",
              "Type": "double",
              "Source": [
                "MovementPowerEnd",
                "movement_power_end"
              ]
            }
          ]
        }
      },
      {
        "Type": "Dtput",
        "SubType": "tage",
        "Format": "csv",
        "DataFileIncludePatterns": [
          "**/leepste*.csv"
        ]
      },
      {
        "Type": "utput",
        "SubType": sence",
        "Format": "csv",
        "DataFileIncludePatterns": [
          "**/sence*.csv"
        ]
      },
      {
        "Type": "PSG",
        "SubType": "Type1",
        "DataSetIncludePatterns": [
          "PSG"
        ]
      }
    ]
  }
}

定义的类如下:

public class DataClassifierSettings
    {
        public List<DataClass> Classes { get; set; }
    }
 public class DataClass
    {
        public string Type { get; set; }
        public string SubType { get; set; }
        public string Format { get; set; }

        public List<string> DataFileIncludePatterns { get; set; } = new List<string>();
        public List<string> DataFileExcludePatterns { get; set; } = new List<string>();
        public List<string> DataSetIncludePatterns { get; set; } = new List<string>();
        public List<string> DataSetExcludePatterns { get; set; } = new List<string>();

        public TableSchema TableSchema { get; set; }
    }

    public interface IDataClassifier
    {
        IEnumerable<DataClass> Classes { get; }
    }
}

【问题讨论】:

  • NewtonSoft Deserialize but I am unsuccessful in getting the desired result. 这是什么意思? JSON.NET 有效。你不需要 JObject。如果您的代码失败,则代码中存在错误,而不是库。发布您的代码
  • 他对给定的 json 使用了错误的模型......他昨天问了类似的问题
  • 没错,昨天我发布了代码,没有错误,我只是得到空值stackoverflow.com/questions/64916752/…
  • 我投票结束这个问题,因为用户之前在stackoverflow.com/questions/64916752/…提出了完全相同的问题
  • 如果你不想使用JObject,你可以创建一个类public class DataClassifierSettings1 { public DataClassifierSettings DataClassifier { get; set; },并使用JsonConvert.DeserializeObject&lt;DataClassifierSettings1&gt;(json);,因为你的json显示一个对象有一个DataClassifier(这是一个模型DataClassifierSettings)}

标签: c# json asp.net-core .net-core json.net


【解决方案1】:

你可以这样做:

DataClassifierSettings1 dataClassifierSettings1 = JsonConvert.DeserializeObject<DataClassifierSettings1>(json);

这里是类:

public class DataClassifierSettings1 {
    public DataClassifierSettings DataClassifier { get; set; }
}
public class TableSchema { 
        public List<Field> Fields { get; set; }
    }
    public class Field {
        public string Name { get; set; }
        public string Type { get; set; }
        public List<string> Source { get; set; }

    }

【讨论】:

    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2018-09-16
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多