Разбор файла JSON для получения данных - PullRequest
2 голосов
/ 04 июля 2019

Использование winforms в c # со следующими пакетами nuget

WindowsAPICodePack-Shell //used for old style folder dialog
Newtonsoft.Json

У меня есть папка файлов со следующей структурой

{
    "modelName": "3K05",
    "Fridge":  
    { 
    "color" : "white",
    "comment" : "sell at discount",  
    "version" : 1,  
    "date" : 20171102,  
    "features" : 264, 
    "purpose" : "Generic",  
    "format" : [1,5,10,0],  
    "build" : [[0,0,0,0,0,0], 
    [22,0,0,20,0,0], 
    [0,30,0,0,0,0], 
    [26,0,0,31,0,90], 
    [0,0,33,0,0,0], ]
    }  
    }

Затем я пытаюсь разобрать, чтобы получить некоторую информациюиспользуя следующий код

foreach (string filename in Directory.GetFiles(dialog.FileName))
                {
                   if (Path.GetExtension(filename) == ".APP") //name of json files
                   {
                       using (StreamReader r = new StreamReader(filename)) //read infile
                       {
                         dynamic array = JsonConvert.DeserializeObject(r.ReadToEnd()); //put into json array
                         foreach (var item in array) //parse thru array
                         {
                             if (item.modelName != null) listBox1.Items.Add(item.modelName); else listBox1.Items.Add("empty"); // get modelName

                             if (item.Fridge != null) listBox1.Items.Add(item.Fridge.color); else listBox1.Items.Add("empty"); //get color

                             if (item.Fridge != null) listBox1.Items.Add(item.Fridge.format); else listBox1.Items.Add("empty"); //get the string inside []

                             if (item.Fridge != null) listBox1.Items.Add(item.Fridge.build); else listBox1.Items.Add("empty"); //get second item as string [[ ] [ 2nd]]
                            }
                       }                       
                   }
                }

Первая проблема заключается в том, что я не могу заставить что-либо работать, если не заключу свои данные в квадратные скобки [].так как я могу заставить его работать без квадратных скобок?

Мои рабочие данные

[
{
"modelName": "3K05",
"Fridge":  
{ 
"color" : "white",
"comment" : "sell at discount",  
"version" : 1,  
"date" : 20171102,  
"features" : 264, 
"purpose" : "Generic",  
"format" : [1,5,10,0],  
"build" : [[0,0,0,0,0,0], 
[22,0,0,20,0,0], 
[0,30,0,0,0,0], 
[26,0,0,31,0,90], 
[0,0,33,0,0,0], ]
}  
} 
]

Второй вопрос: как мне теперь получить информацию из сборки и формата.Из сборки я хочу получить второй элемент в виде строки?

22,0,0,20,0,0

В настоящее время он собирается как коллекция.Я могу видеть, как попасть в первый, если у меня есть Fridge.color, который возвращает белый цвет, но как мне войти в Fridge.build.?


Как я начал работать, это смесь изотвечает, так что спасибо всем, кто ответил.

Я узнал новую часть VS, которая является Edit -> Paste Special -> Paste Json as классы

Затем я использовал ее как

var myObject = JsonConvert.DeserializeObject<Rootobject>(File.ReadAllText(@filename)); 

myObject.xxxx.yyyyy;

xxxx = экземпляр Rootobject класса Json yyyy = элемент в классе Json.Вот как я это понимаю, но слова, которые я использую, могут быть неверными.

Выполнение этого также показывает, что информация о сборке - это просто двумерный массив, с которым я счастлив работать.

Опять же благодаря этому сайту я узнал намного больше о C #

1 Ответ

2 голосов
/ 04 июля 2019

Используя Json2CSharp , следующий класс (ы) моделирует ваш json.

public class Fridge
{
    public string color { get; set; }
    public string comment { get; set; }
    public int version { get; set; }
    public int date { get; set; }
    public int features { get; set; }
    public string purpose { get; set; }
    public List<int> format { get; set; }
    public List<List<int>> build { get; set; }
}

public class RootObject
{
    public string modelName { get; set; }
    public Fridge Fridge { get; set; }
}

Обратите внимание, что вы также можете делать это в Visual Studio, если ваша строка json действительна,Просто перейдите на Правка-> Специальная вставка ..

Затем вы можете потреблять следующим образом:

var myObject=JsonConvert.DeserializeObject<RootObject>();
//get the format list
var formats=myObject.Fridge.format;
var build=myObject.Fridge.build;
...