2014-01-14 64 views
3

我有關於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讚賞! :)

所有最優秀的

+0

做到這一點的一種方法是接受'ImdbVotes'作爲一個字符串,然後解析它。從字符串中剝離不需要的字符[足夠簡單](http://msdn.microsoft.com/zh-cn/library/844skk0h(v = vs.110).aspx)。 –

+0

感謝您的建議,我已回覆底部評論,建議的解決方案是相同的:)。 – D6mi

+0

@ D6mi'N/A'只是一個字符串,你可以做同樣的事情;) – Jim

回答

3

你可以有兩個特性:因爲它從IMDB和其他將是字符串轉換一個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  
    } 
} 
+0

感謝不真實的快速回答:)。我明白你的意思,我確實試着去尋求解決方案,但我認爲更好的方法是通過Custom Converters。 我已經更新了我的問題,所以我想你會建議我爲其他的奸詐的屬性做同樣的事情? – D6mi

+0

@ D6mi - 我不知道,似乎不必要的複雜。再次,我不知道你的項目的需求。 –