Json使用ASP.NET MVC和Json.Net在View中反序列化输出

时间:2016-02-10 12:35:30

标签: c# json asp.net-mvc viewbag json-deserialization

我正在尝试反序列化json对象以使用ASP.NET MVC通过ViewBag显示输出。我正在为我的项目使用以下.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"
                  ]
                }
        ]
    }

我的这个Json对象的Model类是 -

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,我用它来动态地在Textbox中取名。那部分还可以。我只是为了理解而给这堂课 -

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

现在在控制器类中,我创建了ActionResult ShowData,我在其中实现了Json deserilization以获取每个对象,然后将其放入视图包中并在Web上显示。我遇到了一些我在代码旁边提到的问题。比如名字和短信,没关系。但对于纬度,经度和图像,我不知道如何得到这个结果。

 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>

}

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

2 个答案:

答案 0 :(得分:2)

使用此

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>
    }
}

答案 1 :(得分:0)

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

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

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

    // other code as before

    ViewBag.Cities = mycities;

    return View();

  3. 根据您的评论: [edit]

    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列表