2016-04-21 66 views
1

我有一个json文件(文本),有908行值的数据,具有多个硬件类类型。反序列化JSON文件

每个分组都有这些,其中属性根据组件类型进行更改。

"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); 

我在正确的道路上吗?这是我的计划,因为我加载了不同的类别[即处理器,HDD等]将它们加载到特定的DataTable中。一旦文件被完全评估,将不同的DataTables输出到一个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" 
      }, 
     ], 
} 
+0

您最好使用http://json2csharp.com/为特定的json创建合适的C#类, 或者您可以使用edit-> paste special - >在您的Visual Studio中粘贴json As Classes。 –

回答

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年末)编辑>选择性粘贴>粘贴JSON作为菜单项创建这些数据类。只需将您的Json字符串数据复制到剪贴板(Ctrl + C),然后使用选择性粘贴。

+0

感谢所有的阿琳......你的建议是正确的。 – EMIE