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

时间:2015-05-26 07:41:24

标签: c# json windows windows-runtime

我尝试使用Grid App模板将数据构建到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();表示无法将字符串转换为日期时间

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

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

  4. 有人可以用正确的方式帮助我,这样我就不会犯这些错误。

3 个答案:

答案 0 :(得分:1)

您将所有字段都设为string,但您应将其转换为适当的类型:

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

答案 1 :(得分:1)

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

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

JSON中的数字始终为double,因此要将其设为int,您只需将其投射:

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

要从字符串创建Uri对象,请使用其构造函数:

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

答案 2 :(得分:0)

如果您有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;