如何将JSON数据types转换为匹配的C#types

我正尝试使用Grid App模板将数据构build到Windows 8.1应用程序中。 我跟着SampleDataSource.cs和SampleData.json模式,我修改它以适应我的应用程序应该有的数据和项目。 有一个GetMediaDataAsync方法,其代码如下,我得到一些错误。

private async Task GetMediaDataAsync() { // throw new NotImplementedException(); if (this._groups.Count != 0) return; Uri dataUri = new Uri("ms-appx:///DataModel/MediaData.json"); StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(dataUri); string jsonText = await FileIO.ReadTextAsync(file); JsonObject jsonObject = JsonObject.Parse(jsonText); JsonArray jsonArray = jsonObject["Groups"].GetArray(); foreach (JsonValue groupValue in jsonArray) { JsonObject groupObject = groupValue.GetObject(); MediaDataGroup group = new MediaDataGroup(groupObject["UniqueId"].GetString(), groupObject["Title"].GetString(), groupObject["ShortTitle"].GetString(), groupObject["ImagePath"].GetString(), groupObject["Description"].GetString()); foreach (JsonValue itemValue in groupObject["Items"].GetArray()) { JsonObject itemObject = itemValue.GetObject(); group.Items.Add(new MediaDataItem(itemObject["UniqueId"].GetString(), itemObject["Title"].GetString(), itemObject["Subtitle"].GetString(), itemObject["BackgroundImage"].GetString(), itemObject["TitleImage"].GetString(), itemObject["Duration"].GetNumber(), itemObject["Author"].GetString(), itemObject["ReleaseDate"].GetString(), itemObject["Description"].GetString(), itemObject["Format"].GetString(), itemObject["PurchaseLink"].GetString())); } this.Groups.Add(group); } } 

出现错误的行是:

  1. itemsObject["ReleaseDate"].GetString(); 说不能将string转换为date时间

  2. itemsObject["Duration"].GetNumber()表示无法将Double转换为int

  3. itemsObject["PurchaseLink"].GetString()表示无法将string转换为Uri

有人可以帮助我以正确的方式做到这一点,所以我不会得到这些错误。

您将string作为所有字段,但是您应该将它们转换为适当的类型:

 Convert.ToDateTime(itemObject["ReleaseDate"]) Convert.ToInt32(itemObject["Duration"].GetNumber()) new Uri(itemObject["PurchaseLink"].GetString()) 

要将字符串转换为DateTime ,可以解析它,例如:

 DateTime.ParseExact(itemsObject["ReleaseDate"].GetString(), "yyyy-MM-dd", CultureInfo.InvariantCulture) 

JSON中的一个数字总是一个double ,所以要把它作为一个int

 (int)(itemsObject["Duration"].GetNumber()) 

要从字符串中创建一个Uri对象,可以使用它的构造函数:

 new Uri(itemsObject["PurchaseLink"].GetString()) 

如果你有Json对象的字符串内容,你可以使用任何Json库将它转换为你的定义类型,我建议你使用Newton.Json

Examle

JSON:

 {"Name":"MyName","Family":[{"Name":"MyBro Name","Rel":"Brother"}],"Age":15} 

C#类型:

 class FamilyMember{ public string Name{get;set;} public string Rel{get;set;} } class Person{ public string Name{get;set;} public int Age{get;set;} public FamilyMember [] Family{get;set;} } 

这里是用法示例

 var person = JsonConvert.DeserializeObject<Person>(json); var name = person.Name; var age= person.Age;