2016-07-26 57 views
1

我有上已經儲存像下面行的一些hundereds一個JSON文件..數據一次性

[ 
    { 
    "Id": "1", 
    "Name": "A" 
    }, 
    { 
    "Id": "2", 
    "Name": "B" 
    } 
] 

我想這個加載到一個類的集合。這些數據是靜態的,不會改變,所以我只需要加載一次。

我創建了一個類,並將其加載到私有構造函數中並加載到我在該類中的集合中。

public sealed class JsonLoader : IJsonloader 
    { 
     private readonly IEnumerable<Product> products = new List<Product>(); 

     private JsonLoader() 
     { 
      using (var r = new StreamReader("data.json")) 
      { 
       var json = r.ReadToEnd(); 
       products = //deserialse the json here 
      } 
     } 

     public static IEnumerable<Product> Products => this.products; 
    } 

使用結構映射singleton選項實現單例。我想知道我的實施方式是否正確,或者如果這可以進一步改善?

或任何其他最好的辦法嗎?任何幫助非常感謝:)

+0

是否有意識的設計決定不使用類似'Newtonsoft.Json'這樣的庫來進行實際的序列化?問題是,即使你只想讀取文件一次,通過調用ReadToEnd,你會看到整個文件競爭並從它們中創建一個字符串 - 你放棄了流式傳輸。使用lib可以避免這種情況,也不會重新實現其他人已經很好解決的問題。 –

回答

0

好了,我做的例子,JSON對象的字符串採取反序列化,並創造產品對象,並將其添加到產品 列表

public class Program 
{ 
    public class Product 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 

    } 

    static void Main(string[] args) 
    { 
     IList<Product> productList = new List<Product>(); 
     string json = "{\"Id\": 1, \"Name\": \"A\"},{\"Id\": 2, \"Name\": \"B\"}"; 

     string[] jsonArray = json.Split(new string[] { "},{" }, StringSplitOptions.None); 

     foreach (string j in jsonArray) 
     { 
      string jsonTemp = j.Replace("{", "").Replace("}", ""); 
      string myJson = "{" + jsonTemp + "}"; 

      productList.Add(JsonConvert.DeserializeObject<Product>(myJson)); 
     } 

    } 
} 

輸出: 你將有產品列表中有2個對象。

我在Main中創建了它,例如,可以將它作爲獲取字符串作爲參數並返回用戶列表的外部函數(它將是最正確的)。

+0

可以使用幾行解釋去代碼轉儲 – MikeT

+0

一秒鐘我會讓它充滿所有的解釋 –

+0

不要擔心我不投票給出讓人們修復答案的機會,除非答案是完全脫離主題,毫無用處,這絕對不是 – MikeT

相關問題