我需要使用WebAPI为Trivia应用程序创建嵌套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'中的角色'TriviaQuestion_triviaQuiz_Source'中无效。由于“从属角色”是指关键属性,因此从属角色的多重性的上限必须为“enter code here
1”。
我已经花了一周时间研究,但却无法在互联网上找到任何相关内容,可以帮助一些人。
答案 0 :(得分:2)
有些人可能会建议生成JSON的最佳方法是什么。 我应该为此创建一个ViewModel吗?
Nope只是将您的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文件夹
当我运行这个时,我收到一个错误:一个或多个验证错误 在模型生成期间检测到:
你正在使用ORM,我猜这个消息。你有多对一的定义,但双方都不拥有这种关系。
尝试添加public intTriviaQuiz triviaQuizId { get; set; }
作为一般观察,看起来您对数据库和api使用相同的模型。我不建议这样做。而是创建专用于数据库的模型和专用于api(DTO)的模型。然后在它们之间进行映射,这可能是目前的1-1映射,但从长远来看将为您节省潜在的麻烦。
答案 1 :(得分:1)
如果此应用程序的唯一目的是提供数据,而不是任何表示层;您不需要对视图模型进行编码。在您要序列化的对象上使用数据库层属性(Key,ForeignKey等...)通常也是不好的做法 - 您可能需要从数据库中检索的更安全的自定义可序列化版本的对象。现在只需删除
[Key(), ForeignKey("triviaQuiz")]
和
[ForeignKey("triviaQuestion")]
从对象中,您可以将Newtonsoft.JSon库包含到您的项目中,然后只需调用
JsonConvert.SerializeObject(_db.TriviaQuizs.ToList());