使用WebAPI C#创建嵌套JSON

本文关键字:嵌套 JSON 创建 WebAPI 使用 | 更新日期: 2023-09-27 17:53:22

我需要使用WebAPI为Trivia应用程序创建一个嵌套的JSON。我的数据库结构是

琐事测验-测验可以有很多问题。琐事问题-一个问题可以有很多选项(选项(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::多重性在关系"TriviaQuest_triviaQuiz"中的角色"TriviaQuestion_triviaQuiz_Source"中无效。由于Dependent Role引用键属性,因此Dependent Role的多重性的上限必须为"enter code here 1"。

我已经花了一周的时间进行研究,但在互联网上找不到任何相关的东西,有人能帮我吗。

使用WebAPI C#创建嵌套JSON

有人能提出什么是生成JSON的最佳方法吗。我应该为此创建ViewModel吗?

不,只是将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的映射,但从长远来看,这将省去潜在的麻烦。

如果此应用程序的唯一目的是提供数据,而不是任何表示层;您不需要编写视图模型的代码。在正在序列化的对象上使用数据库层属性(Key、ForeignKey等(通常也是不好的做法——您可能想要从数据库中检索到的对象的更安全的自定义可序列化版本。现在只需删除

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

[ForeignKey("triviaQuestion")]

从对象中,您可以将Newtonsoft.JSon库包含到您的项目中,然后只需调用

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