2016-03-03 109 views
0

我不確定是否可以通過爲我正在運行的進程創建一個單獨的類來使我的代碼更清潔,但我這樣做是因爲這是我知道的做法它。基於動態項目列表創建類實例

我的主要目標是從通過HtmlAgilityPack收集的數據創建JSON文件。過去幾天我一直在處理這個問題,但我設法找出了一個辦法。我設法用檢索到的信息創建了一個JSON文件,但它沒有將信息劃分爲對象數組中的單獨對象。相反,它將所有數據聚集爲1個對象。

發生這種情況是因爲我從來沒有在字符串列表中創建帶有解析的html數據的對象。我不需要創建單獨的列表並將它們組合起來,而需要創建一個由解析的html數據創建的對象列表,並將它們添加到列表中。

爲了測試這個假設的方法,我創建了3個類實例,併爲它們提供了值以查看JSON文件是否創建了所需的對象數組。測試時,它會根據需要創建JSON數組對象。

JSON創建:

[{"FavsGTS":"GT1","FavsGPICS":"GP1","FavsRNS":"RN1","FavsPIS":"PI1","FavsIsOns":"true"}, 
{"FavsGTS":"GT2","FavsGPICS":"GP2","FavsRNS":"RN2","FavsPIS":"PI2","FavsIsOns":"false"}, 
{"FavsGTS":"GT3","FavsGPICS":"GP3","FavsRNS":"RN3","FavsPIS":"PI3","FavsIsOns":"true"}] 

現在,我試圖找出我怎麼能動態地創建基於從收集的HTML數據的實例。

我腦子裏想的是什麼做這樣的事情:

gamertagsFav = new List<string>(FavsGTS.Count); 
      gamertagsFav.AddRange(FavsGTS); 

      foreach(string gamertagfav in gamertagsFav) 
      { 
       //creates a class instance and adds the parsed data in the same order. 
      } 

生成實例的一個例子是作爲休耕:

​​

這是可能的,因爲所有的分析數據是在相同的順序。

我的代碼是有點亂,但它是作爲休耕:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using HtmlAgilityPack; 
using System.Web.Script.Serialization; 
using Newtonsoft.Json; 
using System.IO; 

namespace Parser_Test_1._0 
{ 
    public partial class Form1 : Form 
    { 
     public List<string> FavsGTS { get; private set; } 
     public List<string> FavsGPICS { get; private set; } 
     public List<string> FavsRNS { get; private set; } 
     public List<string> FavsPIS { get; private set; } 
     public List<string> FavsIsOns { get; private set; } 
     public List<string> allPlayers { get; private set; } 
     public List<string> gamertagsFav { get; private set; } 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public class gamerprofileFav 
     { 
      public string FavsGTS { get; set; } 
      public string FavsGPICS { get; set; } 
      public string FavsRNS { get; set; } 
      public string FavsPIS { get; set; } 
      public string FavsIsOns { get; set; } 

     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
      doc.Load(@"C:\Users\josec\Documents\Visual Studio 2015\Projects\THE XBOX PROJECT\Parser-Test-1.0\Parser-Test-1.0\bin\Debug\xbFrSourceCode.txt"); 

      string datacollected1 = doc.DocumentNode.SelectNodes("//*[@id=\"favoritesContent\"]/div[2]/div[2]/ul")[0].InnerHtml; 
      string datacollected2 = doc.DocumentNode.SelectNodes("//*[@id=\"friendsContent\"]/div[2]/div[2]")[0].InnerHtml; 
      label1.Text = datacollected1; 
      label2.Text = datacollected2; 

      //StreamWriter sw = new StreamWriter("datacollected1.txt"); 
      //sw.Write(datacollected1); 
      //sw.Close(); 

      //Gamertags 
      HtmlAgilityPack.HtmlDocument favs = new HtmlAgilityPack.HtmlDocument(); 
      favs.LoadHtml(datacollected1); 

      FavsGTS = new List<string>(); 
      HtmlNodeCollection gts = favs.DocumentNode.SelectNodes("//li[@data-gamertag]"); 
      foreach (var gt in gts) 
      { 
       string datagamertag = gt.Attributes["data-gamertag"].Value; 
       FavsGTS.Add(datagamertag); 
      } 

      listBox1.DataSource = FavsGTS; 

      FavsGPICS = new List<string>(); 
      HtmlNodeCollection gpics = favs.DocumentNode.SelectNodes("//li/a[1]/img[1][@src]"); 
      foreach (var gpic in gpics) 
      { 
       string datagpic= gpic.Attributes["src"].Value; 
       FavsGPICS.Add(datagpic); 
      } 

      listBox2.DataSource = FavsGPICS; 

      FavsRNS = new List<string>(); 
      HtmlNodeCollection rns = favs.DocumentNode.SelectNodes("//li/div[2]/div[2]/div[1]/div[1]"); 
      foreach (var rn in rns) 
      { 
       string datarn = rn.InnerText; 
       FavsRNS.Add(datarn); 
      } 

      listBox3.DataSource = FavsRNS; 

      FavsPIS = new List<string>(); 
      HtmlNodeCollection pis = favs.DocumentNode.SelectNodes("//li/div[2]/div[2]/div[1]/div[2]"); 
      foreach (var pi in pis) 
      { 
       string datapi = pi.InnerText; 
       FavsPIS.Add(datapi); 
      } 

      listBox4.DataSource = FavsPIS; 

      FavsIsOns = new List<string>(); 
      HtmlNodeCollection isons = favs.DocumentNode.SelectNodes("//li[@data-isonline]"); 
      foreach (var ison in isons) 
      { 
       string dataison = ison.Attributes["data-isonline"].Value; 
       FavsIsOns.Add(dataison); 
      } 

      listBox5.DataSource = FavsIsOns; 
      //Test 
      gamertagsFav = new List<string>(FavsGTS.Count); 
      gamertagsFav.AddRange(FavsGTS); 

      foreach(string gamertagfav in gamertagsFav) 
      { 

      } 



      //Merge 
      allPlayers = new List<string>(FavsGTS.Count + FavsGPICS.Count + FavsRNS.Count + FavsPIS.Count + FavsIsOns.Count); 
      allPlayers.AddRange(FavsGTS); 
      allPlayers.AddRange(FavsGPICS); 
      allPlayers.AddRange(FavsRNS); 
      allPlayers.AddRange(FavsPIS); 
      allPlayers.AddRange(FavsIsOns); 

      //GpsFav //+Start+ 
      gamerprofileFav gpfav1 = new gamerprofileFav() 
      { 
       FavsGTS = "GT1", 
       FavsGPICS = "GP1", 
       FavsRNS = "RN1", 
       FavsPIS = "PI1", 
       FavsIsOns = "true" 
      }; 
      gamerprofileFav gpfav2 = new gamerprofileFav() 
      { 
       FavsGTS = "GT2", 
       FavsGPICS = "GP2", 
       FavsRNS = "RN2", 
       FavsPIS = "PI2", 
       FavsIsOns = "false" 
      }; 
      gamerprofileFav gpfav3 = new gamerprofileFav() 
      { 
       FavsGTS = "GT3", 
       FavsGPICS = "GP3", 
       FavsRNS = "RN3", 
       FavsPIS = "PI3", 
       FavsIsOns = "true" 
      }; 

      List<gamerprofileFav> gpfavs = new List<gamerprofileFav>(); 
      gpfavs.Add(gpfav1); 
      gpfavs.Add(gpfav2); 
      gpfavs.Add(gpfav3); 
      //GgsFav //-END- 

      listBox6.DataSource = allPlayers; 
      listBox7.DataSource = gamertagsFav; 

      //JSON Serialize 
      //string data = JsonConvert.SerializeObject(gpfavs); 
      //File.WriteAllText("data.json", data); 
     } 
     public class gpsFav 
     { 



     } 

    } 
} 

這是在Form1中運行時: enter image description here

在5個個小列表給出的數據是數據,我希望按照它們出現的相同順序分配給生成的實例。這樣我就可以創建一個基於這些生成的實例的列表,我可以序列化爲一個JSON文件。

回答

0

爲了避免做所有的辛苦工作,已經有一個選項可以將JSON對象反序列化爲可以使用的.NET對象,這是一段代碼;

public class RootObject 
{ 
    public string FavsGTS { get; set; } 
    public string FavsGPICS { get; set; } 
    public string FavsRNS { get; set; } 
    public string FavsPIS { get; set; } 
    public string FavsIsOns { get; set; } 
} 

當您只需通過反序列化;

RootObject gamertag_sample = JsonConvert.DeserializeObject<RootObject>(jsonstr); 

當然,如果你通過它RootObject的數組,你需要的類型與<RootObject[]>更換<RootObject>等。

據我瞭解,這是您尋求解決方案的唯一問題,或者我錯過了什麼?

編輯: 隨着動態對象,你可以創建任何值的條目,但你需要經過一系列的任務才能做到這一點。

// this would contain your key,value for the generated instance. 
// {example_key, "value"} would result later in myObject.example_key (returning "value") 
var expandoObj = new ExpandoObject(); 
var eoCollection = (ICollection<KeyValuePair<string, object>>)expandoObj; 
// add your key value pairs here 
eoCollection.Add(new KeyValuePair<string, object>("example", "example value")); 

dynamic myDynamicObject = expandoObj; 
// myDynamicObject.example will return "example value", and would result in json: 
// "example":"example value" 
+0

是的,你有誤讀。我現在不想反序列化任何JSON文件。我想序列化一個。我設法弄清楚如何做到這一點,但要創建一個作爲一個願望,我需要首先創建一個有序的列表。我設法通過創建類實例來做到這一點。我想弄清楚如何根據生成的列表動態創建類實例。 –

+0

那麼我的錯,我很抱歉;您是否嘗試過查看動態關鍵字選項?我只是苦惱了一下,找到了你要求的解決方案,請原諒我。 – L33T

+0

我不確定什麼是「動態關鍵字選項」,但我查看了動態對象和動態實例,但是我還沒有找到一種方法來根據解析的數據來創建實例。目前我正試圖弄清楚如何在gamertagsfav中爲每個gamertagfav創建一個實例,並在public class gamerprofileFav上設置所需的信息。如果您知道有人可以幫助解決此問題,請分享/ –