反序列化JSON文件

时间:2016-04-21 05:51:23

标签: c# json json.net

我有一个json文件(文本),它有908行数据,有多种硬件类类型。

每个分组都有这些,其中属性根据组件类型而变化。

"HardwareID": "ACPI\\AuthenticAMD_-_AMD64_Family_16_Model_4",
"Count": "8",
"Class": "Processor",
"Properties": { }
"DeviceType": "Cpu",
"Description": "Quad-Core AMD Opteron(tm) Processor 2373 EE"

我认为第一部分是公共类(即设备),它分解了json文件的结构。它是否正确?如果是这样,我该如何添加属性?

然后加载后,我可以按以下方式反序列化对象。

Devices device = JsonConvert.DeserializeObject<Devices>(json);

我在正确的道路上吗?这是我的计划,因为我加载了不同的类[即]处理器,硬盘驱动器等]将它们加载到特定的DataTable中。完成文件评估后,将不同的DataTable输出到csv文件。这将使我能够评估不同的组件。

namespace jsonReader
{
    using System;
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    using Newtonsoft.Json;

    [DataContract]
    public class RootObject
    {
         public class Devices
         { 
              public string HardwareId { get; set; }
              public int Count { get; set; }
              public string Class { get; set; }
              public  IList<string> Properties { get; set; }
              public string DeviceType { get; set; }
              public string Description { get; set; }
         }
    }

这是我的json文件的样子。

{
    "Devices": [
        {
            "HardwareID": "ACPI\\AuthenticAMD_-_AMD64_Family_16_Model_4",
            "Count": "8",
            "Class": "Processor",
            "Properties": {
                   "CPUIDBrandString": "Quad-Core AMD Opteron(tm) Processor 2373 EE",
                   "CPUIDString": "AuthenticAMD",
                   "CPUIDMultithreading": "1",
                   "CPUIDBrandID": "0",
                   "CPUIDExtFamily": "1",
                   "CPUIDExtModel": "0",
                   "CPUIDSteppingID": "2",
                   "CPUIDNumberOfCores": "0",
                   "CPUIDLogicalCPUCount": "4",
                   "CPUIDFamily": "15",
                   "CPUIDVMExt": "0",
                   "CPUCount": "8",
                   "CPUIDProcessorID": "1696726757271408450",
                   "IsNuma": "true",
                   "CPUIDType": "0",
                   "Cpu_Temperature": "0.000000",
                   "CPUIDCapable64bit": "1",
                   "CPUIDModel": "4"
              },
              "DeviceType": "Cpu",
              "Description": "Quad-Core AMD Opteron(tm) Processor 2373 EE"
           },
       ],
}

1 个答案:

答案 0 :(得分:2)

  

我认为第一部分是公共类(即设备),它分解了json文件的结构。这是对的吗?

是的。基本上你会创建一个代表你的Josn的class

  

如果是,我该如何添加属性?

您案例中的Properties本身就是class,因此您应该创建一个代表它的class

所以你的课程将如下所示:

public class RootObject
{
    public Device[] Devices { get; set; }
}

public class Device
{
    public string HardwareID { get; set; }
    public string Count { get; set; }
    public string Class { get; set; }
    public Properties Properties { get; set; }
    public string DeviceType { get; set; }
    public string Description { get; set; }
}

public class Properties
{
    public string CPUIDBrandString { get; set; }
    public string CPUIDString { get; set; }
    public string CPUIDMultithreading { get; set; }
    public string CPUIDBrandID { get; set; }
    public string CPUIDExtFamily { get; set; }
    public string CPUIDExtModel { get; set; }
    public string CPUIDSteppingID { get; set; }
    public string CPUIDNumberOfCores { get; set; }
    public string CPUIDLogicalCPUCount { get; set; }
    public string CPUIDFamily { get; set; }
    public string CPUIDVMExt { get; set; }
    public string CPUCount { get; set; }
    public string CPUIDProcessorID { get; set; }
    public string IsNuma { get; set; }
    public string CPUIDType { get; set; }
    public string Cpu_Temperature { get; set; }
    public string CPUIDCapable64bit { get; set; }
    public string CPUIDModel { get; set; }
}

请注意,您不需要使用DataContract属性,并且需要编写反序列化Json(使用Json.NET):

Devices device = JsonConvert.DeserializeObject<RootObject>(json);

作为提示,您可以使用Visual Studio(2012年)编辑&gt;轻松创建这些数据类。选择性粘贴&gt;将JSON粘贴为类菜单项。只需将您的Json字符串数据复制到剪贴板(Ctrl + C),然后使用Paste Special。