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