我有關於Json.NET和omdbapi的問題。我試圖從omdbapi檢索信息,有些屬性讓我很頭疼,特別是「imdbVotes」,因爲它被寫入,例如「321,364」,所以我無法從中獲得整數。Json.NET - 自定義轉換器 - 字符串到國際
我敢打賭,我需要一個自定義轉換器,但我現在恐怕不知道如何爲我的特定問題創建一個轉換器。
所有其他屬性工作得很好(我目前沒有使用它們)。
這是響應,可以說抓舉: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:
我如何處理響應當地產有價值「不適用」?這發生在一些電影上(例如,http://www.omdbapi.com/?i=&t=four+rooms將它的Metascore設置爲N/A)。
更新#2:
另一個相關的調查。我使用的是帶有MySQL的EF6,這個想法是用通過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配置上下文類(我忽略了字符串字段,而是使用助手的人,因爲數據庫被配置爲接受int作爲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)正在返回零,我想不通爲什麼。
任何幫助將mucho讚賞! :)
所有最優秀的
做到這一點的一種方法是接受'ImdbVotes'作爲一個字符串,然後解析它。從字符串中剝離不需要的字符[足夠簡單](http://msdn.microsoft.com/zh-cn/library/844skk0h(v = vs.110).aspx)。 –
感謝您的建議,我已回覆底部評論,建議的解決方案是相同的:)。 – D6mi
@ D6mi'N/A'只是一個字符串,你可以做同樣的事情;) – Jim