列表未显示JSON文件中的元素

时间:2019-07-15 12:32:00

标签: c# asp.net .net asp.net-mvc

我正在学习一种新的框架(ASP.NET)及其关联的语言(C#)。这对我来说并不容易,因为我只有Python技能,而且不是面向对象的编程专家。

目标:

通过遵循一些教程,我试图将数据从JSON文件导入到我的模型中。然后,在控制器中,我尝试获取数据并在视图中显示。

我不知道为什么,但是没有显示数据,也没有任何问题。

这是我的模型课:

namespace Blog.Models
{
    public class Article
    {
        public string Pseudo { get; set; }
        public string Titre { get; set; }
        public string Contenu { get; set; }
    }
}

我还有另一个可以从我的文章创建列表的类:

namespace Blog.Models
{
    /// <summary>
    /// permet de gérer les articles qui sont enregistrés dans un fichier JSON
    /// </summary>
    public class ArticleJSONRepository
    {
        /// <summary>
        /// Représente le chemin du fichier JSON
        /// </summary>
        private readonly string _savedFile;

        /// <summary>
        /// Construit le gestionnaire d'article à partir du nom d'un fichier JSON
        /// </summary>
        /// <param name="fileName">nom du fichier json</param>
        public ArticleJSONRepository(string fileName)
        {
            _savedFile = fileName;
        }

        /// <summary>
        /// Obtient une liste de tout les articles
        /// </summary>
        public IEnumerable<Article> GetAllListArticle()
        {
            using (StreamReader reader = new StreamReader(_savedFile))
            {
                List<Article> list = JsonConvert.DeserializeObject<List<Article>>(reader.ReadToEnd());
                return list;
            }
        }
    }
}

我的JSON文件如下所示(非常简单):

{
    "post": {
        "Pseudo": { "value": "Clem" },
        "Titre": { "value": "mon article" },
        "Contenu": { "value": "Du texte, du texte, du texte" }
    }
}

然后,我将控制器命名为ArticleController

namespace Blog.Controllers
{
    public class ArticleController : Controller
    {
        private readonly ArticleJSONRepository _repository;

        public ArticleController()
        {
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "articles.json");
            _repository = new ArticleJSONRepository(path);
        }
        // GET: Article
        public ActionResult Index()
        {
            return View("Index");
        }

        public ActionResult List()
        {
            try
            {
                List<Article> liste = _repository.GetAllListArticle().ToList();
                Console.WriteLine(liste);
                return View(liste);
            }
            catch
            {
                return View(new List<Article>());
            }
        }
    }
}

最后,我的视图名为List.cshtml

@model IEnumerable<Blog.Models.Article>

@{
    ViewBag.Title = "List";
    Layout = "~/Views/Shared/__Layout.cshtml";
}

<h2>List</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Pseudo)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Titre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Contenu)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Pseudo)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Titre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Contenu)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        </td>
    </tr>
}

</table>

它给了我

enter image description here

如果我删除了try/catch,就会出现以下问题:

  

无法反序列化当前JSON对象(例如{“ name”:“ value”})   进入类型'System.Collections.Generic.List`1 [Blog.Models.Article]'   因为该类型需要JSON数组(例如[1,2,3])进行反序列化   正确地。要解决此错误,请将JSON更改为JSON数组   (例如[1,2,3])或更改反序列化类型,使其成为常规   .NET类型(例如,不是整数之类的原始类型,不是集合   可以从JSON反序列化的类型(如数组或列表)   宾语。也可以将JsonObjectAttribute添加到类型中以强制它   从JSON对象反序列化。路径“ post”,第2行,位置11。

2 个答案:

答案 0 :(得分:0)

在您的情况下,您的awk -F"RMK AO2.*SLP" '{$0=$0~FS?$1"RMK AO2 SLP "$2:$0}1' file KDFW 151753Z 17018G25KT 10SM FEW035 FEW120 SCT250 32/21 A2983 RMK AO2 SLP 093 T03220211 10322 20239 58008 无法反序列化问题中的Model字符串。我已经为您的JSON字符串准备了一个反序列化示例。代码如下:

JSON

这将产生以下输出:

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        string json=@"{'post':{'Pseudo':{'value':'Clem'},'Titre':{'value':'mon article'},'Contenu':{'value':'Du texte, du texte, du texte'}}}";
        var Sresponse = JsonConvert.DeserializeObject<RootObject>(json);
        Console.WriteLine(Sresponse.post.Pseudo.value);
        Console.WriteLine(Sresponse.post.Titre.value);
        Console.WriteLine(Sresponse.post.Contenu.value);

    }
}

public class Pseudo
{
    public string value { get; set; }
}

public class Titre
{
    public string value { get; set; }
}

public class Contenu
{
    public string value { get; set; }
}

public class Post
{
    public Pseudo Pseudo { get; set; }
    public Titre Titre { get; set; }
    public Contenu Contenu { get; set; }
}

public class RootObject
{
    public Post post { get; set; }
}

您可以相应地在新的Clem mon article Du texte, du texte, du texte 中将输出分配给关联的变量,具体取决于您的实现,并将Model发送到Model

有效的演示在这里:https://dotnetfiddle.net/oCuZND

答案 1 :(得分:0)

当前的问题是您的json文件与您要求JsonConvert生成的数据结构不匹配。尝试使用以下格式的json文件:

[  
   {  
      "Pseudo":"quelque_chose_1",
      "Titre":"quelque_chose_2",
      "Contenu":"quelque_chose_3"
   },
   {  
      "Pseudo":"quelque_chose_1",
      "Titre":"quelque_chose_2",
      "Contenu":"quelque_chose_3"
   }
]