使用WebAPI C#创建嵌套JSON?

时间:2016-06-30 15:16:33

标签: c# json

我需要使用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”。

我已经花了一周时间研究,但却无法在互联网上找到任何相关内容,可以帮助一些人。

2 个答案:

答案 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());