2016-06-30 44 views
0

我需要使用WebAPI爲Trivia應用程序創建嵌套的JSON。我的數據庫結構是用WebAPI C#創建嵌套的JSON?

TriviaQuiz - 測驗可以有很多問題。 TriviaQuestion - 一個問題可以有很多的選擇(選擇) TriviaOption - 答案列表(選擇)

我需要產生JSON以下格式

{ 
    "quiz" : [{ 
     "id" : 1, 
     "name" :"Guess Fruit Color", 
     "description": "You need to guess color of fruits", 
     "questions" : [ 
      {"id" : 1000 , "quizId" : 1 , "description": "The color of apple is" , "options" : [ 
          {"id" : 1 , "questionId" : 1000 , "description" : "Green", "correctAnswer" : false }, 
          {"id" : 2 , "questionId" : 1000 , "description" : "Red", "correctAnswer" : true }, 
          {"id" : 3 , "questionId" : 1000 , "description" : "Pink", "correctAnswer" : false }, 
          {"id" : 4 , "questionId" : 1000 , "description" : "Purple", "correctAnswer": false }  
      ] 
      }, 
      {"id" : 1001 , "quizId" : 1 , "description": "The color of mangoss is" , "options" : [ 
          {"id" : 5 , "questionId" : 1001 , "description" : "Green", "correctAnswer" : false }, 
          {"id" : 6 , "questionId" : 1001 , "description" : "Red", "correctAnswer" : false }, 
          {"id" : 6 , "questionId" : 1001 , "description" : "Yello", "correctAnswer" : true }, 
          {"id" : 8 , "questionId" : 1001 , "description" : "Purple", "correctAnswer": false }  
      ] 
      }  
     ]} 
    ] 
} 

我設計我的課像

public class TriviaQuiz 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
     public string description { get; set; } 

     //A Quiz can have many questions 
     public virtual List<TriviaQuestion> questions { get; set; } 
    } 

public class TriviaQuestion 
    { 
     [Key(), ForeignKey("triviaQuiz")] 
     public int id { get; set; } 
     public string description { get; set; } 

     //Navigation Property to set foreign key relationship 
     [JsonIgnore] 
     public virtual TriviaQuiz triviaQuiz { get; set; } 

     //A question can have many options 
     public virtual List<TriviaOption> options { get; set; } 
    } 

public class TriviaOption 
    { 
     public int id { get; set; } 
     [ForeignKey("triviaQuestion")] 
     //Tell EF That questionId is a Foreign key to TriviaQuestion table 
     public int questionId { get; set; } 
     public string description { get; set; } 
     public Boolean correctAnswer { get; set; } 

     //Navigation Property to set up Foreign key relation ship 
     [JsonIgnore] 
     public virtual TriviaQuestion triviaQuestion { get; set; } 
    } 

我的WebAPI貌似這個

public List<TriviaQuiz> getTopJson() 
     { 
      return _db.TriviaQuizs.ToList(); 
     } 

有些人可以建議什麼是生成JSON的最佳方法。我應該爲此創建一個ViewModel嗎?

當我運行此我得到一個錯誤:模型生成過程中檢測到 一個或多個驗證錯誤:

TriviaQuestion_triviaQuiz_Source:多重不是在關係中的作用「TriviaQuestion_triviaQuiz_Source「TriviaQuestion_triviaQuiz」有效。因爲依賴角色是指關鍵屬性,所以依賴角色的多重性的上界必須是'enter code here 1'。

我已經花了一個星期的研究,但無法找到任何與互聯網相關的東西,有人可以幫助。

回答

2

Can some some suggest what is the best approach to generate JSON. Should I be creating a ViewModel for this?

不準配置您的web應用程序以默認返回json並返回該對象。

添加

/// <summary> 
    /// The Web api config. 
    /// </summary> 
    public class WebApiConfig 
    { 
     /// <summary> 
     /// Registers the specified configuration. 
     /// </summary> 
     /// <param name="config">The configuration.</param> 
     public static void Register(HttpConfiguration config) 
     { 
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 

      var settings = config.Formatters.JsonFormatter.SerializerSettings; 

      settings.Formatting = Formatting.None; 
      settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      settings.NullValueHandling = NullValueHandling.Ignore; 
      settings.DateFormatHandling = DateFormatHandling.IsoDateFormat; 
      settings.DateParseHandling = DateParseHandling.DateTimeOffset; 
      settings.Converters.Add(new OptionalJsonConverter()); 

您app_start文件夾

When I run this I get an error: One or more validation errors were detected during model generation:

使用ORM你的,我是從消息猜測。你有一個多對一的定義,但雙方都沒有關係。 嘗試添加public intTriviaQuiz triviaQuizId { get; set; }

作爲一般觀察,它看起來像你使用相同的模型的數據庫和api。我不會建議這一點。而是創建專用於數據庫的模型和專用於api(DTO)的模型。然後在它們之間映射,這可能是目前的1-1映射,但從長遠來看可以爲您節省潛在的麻煩。

+0

你打我吧:) –

+0

我也建議使用,而不是駝峯規則,因爲這是一個標準的.NET命名約定Pascal大小寫定義您的模型。然後將Json序列化程序設置爲使用CamelCasePropertyNamesContractResolver編寫camelCase – Fran

+0

我在Web.config中添加了這些條目以僅返回JSON,但仍然收到相同的錯誤。我也刪除了Virtual關鍵字來禁用延遲加載,但沒有幫助。所以當你說創建DTO意味着創建一個ViewModel時,我感到困惑? –

1

如果此應用程序的唯一目的是提供數據,而不是任何表示層;你不需要編碼視圖模型。在序列化的對象上使用數據庫層屬性(Key,ForeignKey等)通常也是一種不好的做法 - 您可能需要一個更安全的自定義可序列化版本的數據庫對象。現在只是從對象中刪除

[Key(), ForeignKey("triviaQuiz")] 

[ForeignKey("triviaQuestion")] 

,您可以包括Newtonsoft。JSON庫到您的項目,然後只需調用

JsonConvert.SerializeObject(_db.TriviaQuizs.ToList()); 
+0

偉大的思想和所有這一切:D – Mark

+1

他不應該需要調用SerializeObject。 WebApi將爲他做到這一點。 – Fran