2010-10-20 120 views
1

我使用Newtonsoft.Json.Linq,我想将数据加载到我定义的对象(或结构体)中,并将这些对象放入列表或集合中。从文本文件加载JSON数据流到对象C#

目前我拉出的索引名称的JSON属性。

filename = openFileDialog1.FileName; 

StreamReader re = File.OpenText(filename); 
JsonTextReader reader = new JsonTextReader(re); 
string ct = ""; 

JArray root = JArray.Load(reader); 
foreach (JObject o in root) 
{ 
    ct += "\r\nHACCstudentBlogs.Add(\"" + (string)o["fullName"] + "\",\"\");"; 
} 
namesText.Text = ct; 

的对象被定义如下,并且有时JSON将不包含的属性值:

class blogEntry 
{ 
    public string ID { get; set; } 
    public string ContributorName { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string CreatedDate { get; set; } 
} 
+1

请告诉我问题吗? – 2010-10-20 00:24:25

+0

此外,这些属性可能是自动属性,而不是由专用字段支持。 – 2010-10-20 00:28:23

+0

问题是如何将jSON对象放入我的对象的实例中? – Caveatrob 2010-10-20 00:31:25

回答

3

您可以使用JsonConvert.DeserializeObject<T>

[TestMethod] 
public void CanDeserializeComplicatedObject() 
{ 
    var entry = new BlogEntry 
    { 
     ID = "0001", 
     ContributorName = "Joe", 
     CreatedDate = System.DateTime.UtcNow.ToString(), 
     Title = "Stackoverflow test", 
     Description = "A test blog post" 
    }; 

    string json = JsonConvert.SerializeObject(entry); 

    var outObject = JsonConvert.DeserializeObject<BlogEntry>(json); 

    Assert.AreEqual(entry.ID, outObject.ID); 
    Assert.AreEqual(entry.ContributorName, outObject.ContributorName); 
    Assert.AreEqual(entry.CreatedDate, outObject.CreatedDate); 
    Assert.AreEqual(entry.Title, outObject.Title); 
    Assert.AreEqual(entry.Description, outObject.Description); 
} 
11

可以反序列化JSON流引入使用JsonSerializer类的真实对象。

var serializer = new JsonSerializer(); 
using (var re = File.OpenText(filename)) 
using (var reader = new JsonTextReader(re)) 
{ 
    var entries = serializer.Deserialize<blogEntry[]>(reader); 
}