如何将 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);
}
}
给出错误的行是:
itemsObject["ReleaseDate"].GetString();
表示无法将字符串转换为 Datetime
itemsObject["Duration"].GetNumber()
表示无法将 Double 转换为 int
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;
我试图使用网格应用程序模板将数据构建到 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);
}
}
给出错误的行是:
itemsObject["ReleaseDate"].GetString();
表示无法将字符串转换为 DatetimeitemsObject["Duration"].GetNumber()
表示无法将 Double 转换为 intitemsObject["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;