我正在尝试反序列化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>
}
我需要建议我应该在我的代码中修改哪一部分。
答案 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)
根据我留下的评论,您有两种选择:
创建强类型视图模型并将其传递给视图。这需要对现有代码进行一些更改
在循环之后,只需在代码中指定ViewBag.Cities = mycities;
,即:
// other code as before
ViewBag.Cities = mycities;
return View();
根据您的评论: [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
列表