2016-04-21 3 views
1

У меня есть json-файл (текст), который содержит 908 строк данных с несколькими типами аппаратного класса.Deserializing 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/, чтобы сделать правильный класс C# для конкретного json, или вы можете использовать edit-> paste special -> Paste json As Classes внутри вашей Visual studio. –

ответ

2

Я считаю, что первая часть является открытый класс (т.е. устройств), что срывов, как структурирован файл в формате JSON. Это верно?

Да, это так. В основном вы складываете class, который представляет ваш Josn.

Если да, то как добавить свойства?

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 As Classes пункт меню. Просто скопируйте строковые данные Json в клип-панель (Ctrl + C), затем используйте Paste Special.

+0

Спасибо за все Арин ... ваши предложения были на правильном пути. – EMIE