gpt4 book ai didi

c# - Json.NET - 自定义转换器 - 字符串到 Int

转载 作者:行者123 更新时间:2023-11-30 16:13:56 24 4
gpt4 key购买 nike

我有一个关于 Json.NET 和 omdbapi 的问题。我正在尝试从 omdbapi 检索信息,但一些属性让我很头疼,尤其是“imdbVotes”,因为它被写成,例如,“321,364”,所以我无法从中获取整数。

我敢打赌我需要一个自定义转换器,但恐怕目前我还不太了解如何为我的特定问题创建一个转换器。

所有其他属性都运行良好(我目前没有使用所有属性)。

这是对 Snatch 的响应:http://www.omdbapi.com/?i=&t=snatch

这是我的课:

public class MovieJSON
{
[JsonProperty(PropertyName = "Title")]
public String Title { get; set; }

[JsonProperty(PropertyName = "Year")]
public int Year { get; set; }

[JsonProperty(PropertyName = "Genre")]
public String Genre { get; set; }

[JsonProperty(PropertyName = "Director")]
public String Director { get; set; }

[JsonProperty(PropertyName = "Actors")]
public String Actors { get; set; }

[JsonProperty(PropertyName = "Plot")]
public String Plot { get; set; }

[JsonProperty(PropertyName = "Poster")]
public String Poster { get; set; }

[JsonProperty(PropertyName = "Metascore")]
public int Metascore { get; set; }

[JsonProperty(PropertyName = "imdbRating")]
public decimal ImdbRating { get; set; }

[JsonProperty(PropertyName = "imdbVotes")]
public int ImdbVotes { get; set; }
}

更新#1:

当属性值为“N/A”时如何处理响应?。某些电影会发生这种情况(即 http://www.omdbapi.com/?i=&t=four+rooms 的 Metascore 设置为 N/A)。

更新#2:

另一个相关查询。我将 EF6 与 MySQL 结合使用,我的想法是使用通过 JSON 解析创建的电影填充数据库。

这是我的电影课:

[JsonObject(MemberSerialization.OptIn)]
[Table("movies")]
public class MovieJSON
{
[Key]
public int Id { get; set; }

[JsonProperty(PropertyName = "Title")]
[Column("title")]
public String Title { get; set; }

[JsonProperty(PropertyName = "Year")]
[Column("year")]
public int Year { get; set; }

[JsonProperty(PropertyName = "Genre")]
[Column("genre")]
public String Genre { get; set; }

[JsonProperty(PropertyName = "Director")]
[Column("director")]
public String Director { get; set; }

[JsonProperty(PropertyName = "Actors")]
[Column("actors")]
public String Actors { get; set; }

[JsonProperty(PropertyName = "Plot")]
[Column("plot")]
public String Plot { get; set; }

[JsonProperty(PropertyName = "Poster")]
[Column("poster")]
public String Poster { get; set; }

[JsonProperty(PropertyName = "Metascore")]
public String Metascore { get; set; }

[Column("metascore")]
public int MetascoreInt
{
get
{
int result;
if (int.TryParse(Metascore, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out result))
return result;
return 0;
}
}

[JsonProperty(PropertyName = "imdbRating")]
public String ImdbRating { get; set; }

[Column("imdb_rating")]
public Decimal ImdbRatingDecimal
{
get
{
Decimal result;
if (Decimal.TryParse(ImdbRating, out result))
return result;
return 0;
}
}

[JsonProperty(PropertyName = "imdbVotes")]
public String ImdbVotes { get; set; }

[Column("imdb_votes")]
public long ImdbVotesLong
{
get
{
long result;
String stringToParse = ImdbVotes.Remove(ImdbVotes.IndexOf(','), 1);

if (long.TryParse(stringToParse, out result))
return result;
return 0;
}
}

[JsonProperty(PropertyName = "imdbID")]
[Column("imdb_id")]
public String ImdbID { get; set; }

[JsonProperty(PropertyName = "type")]
[Column("type")]
public String Type { get; set; }

public override string ToString()
{
String[] propertiesToIgnore = {"MetascoreInt", "ImdbRatingDecimal", "ImdbVotesLong"};
var sb = new StringBuilder();

PropertyInfo[] properties = GetType().GetProperties();

foreach (PropertyInfo propertyInfo in properties)
{
if (propertiesToIgnore.Contains(propertyInfo.Name))
continue;

sb.AppendLine(String.Format("{0} : {1} ",
propertyInfo.Name, propertyInfo.GetValue(this, null)));
}

return sb.ToString();
}
}

这是我的 EF6 配置上下文类(我忽略了 String 字段,而是使用了 Helper 字段,因为数据库被配置为接受 int for Metascore 等等):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MovieJSON>().Ignore(e => e.Metascore).Ignore(e => e.ImdbRating).Ignore(e => e.ImdbVotes);
base.OnModelCreating(modelBuilder);
}

附加图像信息:

插入数据库前的对象值(所有值均已正确设置)

Valid XHTML http://imagizer.imageshack.us/v2/800x600q90/689/8x5m.png

数据库中的值:

Valid XHTML http://imagizer.imageshack.us/v2/800x600q90/844/nvc5.png

辅助字段(MetascoreInt、ImdbRatingDecimal、ImdbVotesLong)返回零,我不明白为什么。

任何帮助将不胜感激! :)

一切顺利

最佳答案

您可以有两个属性:一个是来自 IMDB 的字符串属性,另一个是将字符串转换为 1 的 int 属性。要转换,您可以使用漂亮的 NumberStyles.AllowThousands旗帜。所以你会有

[JsonProperty(PropertyName = "imdbVotes")]
public string ImdbVotes { get; set; }

public int ImdbVotesInt
{
get
{
int result;
if (int.TryParse(ImdbVotes,
NumberStyles.AllowThousands,
CultureInfo.InvariantCulture,
out result))
return result; // parse is successful, use 'result'
else
return 0; // parse is unsuccessful, return whatever default value works for you
}
}

关于c# - Json.NET - 自定义转换器 - 字符串到 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com