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

How do I convert JSON data types to matching C# types

我试图使用网格应用程序模板将数据构建到 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(); 表示无法将字符串转换为 Datetime

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

  3. itemsObject["PurchaseLink"].GetString() 表示无法将字符串转换为 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

例子

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;