Json 使用 ASP.NET MVC 和 Json.Net 反序列化输出显示在视图中

Json deserialize output show in View using ASP.NET MVC and Json.Net

我正在尝试反序列化 json 对象以使用 ASP.NET 通过 ViewBag 显示输出 MVC.I 我正在为我的项目使用以下 .Json 文件-

{
        "poi":[
                {
                  "Name": "Berlin",
                  "Shorttext": "Berlin is the capital of Germany and one of the 16 states of Germany.....",
                  "GeoCoordinates": {
                    "Longitude": 13.38333333,
                    "Latitude": 52.51666667
                  },
                  "Images": [
                    "BA5AB22B.jpg"
                  ]
                },
                {
                  "Name": "munich",
                 "Shorttext": "Munich of the European Union with a population of above 1.5 million.....",
                  "GeoCoordinates": {
                    "Longitude": 11.56666667,
                    "Latitude": 48.13333333
                  },
                  "Images": [
                    "AA3CF664.jpg"
                  ]
                }
        ]
    }

我的模型 class 来自这个 Json 对象是-

public class GeoCoordinates
 {
   public double Longitude { get; set; }
   public double Latitude { get; set; }
 }

 public class Poi
 {
   public string Name { get; set; }
   public string Shorttext { get; set; }
   public GeoCoordinates GeoCoordinates { get; set; }
   public List<string> Images { get; set; }
  }

  public class RootObject
  {
   public List<Poi> poi { get; set; }
  }

我制作了另一个 City.cs,用于在文本框中动态获取名称。那部分没问题 here.I 我给出这个 class 只是为了理解-

public class City
{
    public string Name { get; set; }
}

现在在控制器中 class 我创建 ActionResult ShowData 并在其中实施 Json 反序列化以获取每个对象,然后将其放入视图包中并在网络上显示。我遇到了一些问题,我在 code.Such 旁边提到过,关于名称和短文本没问题。但是对于纬度、经度和图像,我不确定如何得到这个结果。

 string name = objCityModel.Name;
        ViewBag.Title = name;

        var ReadJson = System.IO.File.ReadAllText(Server.MapPath(@"~/App_Data/"+name+".json"));

        RootObject json = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<RootObject>(ReadJson);
        List<POI> mycities = new List<POI>();
        foreach (var item in json.poi)
        {
            POI obj = new POI()
            {
                Name = item.Name,
                Shorttext = item.Shorttext,
                GeoCoordinates =item.GeoCoordinates.Latitude, //show Error Duplicate initialization of member 'GeoCoordinates'
                GeoCoordinates=item.GeoCoordinates.Longitude, //show Error Duplicate initialization of member 'GeoCoordinates'
                Images = string.Join(" ", item.Images), // Not sure what to do here, it is a list of images 

            };
            mycities.Add(obj);
        }

        ViewBag.Cities = mycities;

        return View();
    }

最后在 ShowData 视图中,我以这种方式实现了我的代码。但由于我在控制器中遇到问题,数据未在此处显示-

@model  new_test_Json.Models.City



@{
ViewBag.Title1 = "Show Data";
} 


@foreach (var item in ViewBag.Cities)
{
    <h2>@item.Name</h2>
    <p>@Html.Raw(@item.Shorttext)</p>
    <p>@item.Latitude</p>
    <p>@item.Longitude</p>
    <img src=@item.Image>

}

我需要建议我应该在我的代码中修改哪一部分。

根据我留下的评论,您有两个选择:

  1. 创建强类型视图模型并将其传递给视图。这需要对现有代码进行一些更改

  2. 只需在代码中分配 ViewBag.Cities = mycities;,在循环之后,即:

    // other code as before

    ViewBag.Cities = mycities;

    return View();

根据您的评论:[编辑]

foreach (var item in json.poi)
{
    POI obj = new POI()
    {
        Name = item.Name,
        Shorttext = item.Shorttext,
        GeoCoordinates = item.GeoCoordinates,
        Images = item.Images
    };
    mycities.Add(obj);
}

那么,在您看来:

<p>@item.GeoCoordinates.Longitude</p>
<p>@item.GeoCoordinates.Latitude</p>

然后您还需要以相同的方式循环 item.Images 列表

使用这个

foreach (var item in json.poi)
    {
        POI obj = new POI()
        {
            Name = item.Name,
            Shorttext = item.Shorttext,
            GeoCoordinates =item.GeoCoordinates,
            Images = item.Images
        };
        mycities.Add(obj);
    }

那么,在您看来:

@foreach (var item in ViewBag.Cities)
{
    <h2>@item.Name</h2>
    <p>@Html.Raw(@item.Shorttext)</p>
    <p>@item.GeoCoordinates.Longitude</p>
    <p>@item.GeoCoordinates.Longitude</p>
    foreach (var image in item.Images)
    {
        <img src=@image>
    }
}