【问题标题】:Parsing Multidimensional JSON Array with Newtonsoft Json.NET使用 Newtonsoft Json.NET 解析多维 JSON 数组
【发布时间】:2012-04-03 00:18:24
【问题描述】:

我的 Json 返回如下:

[{"CreatedBy":"GIS_DB","CreatedDate":"3/8/2012 10:44:00 AM","Id":39,"ModifiedBy":"","ModifiedDate":"","Name":"CF-39","StatusId":1,"TrailCoordinates":[{"CreatedBy":" GIS_DB","创建日期":"2012 年 3 月 8 日 10:44:00 AM","Id":1637,"Latitude":32.76004207,"Longitude":-97.34006853,"ModifiedBy":"","ModifiedDate":"","SortOrder":1,"TrailId":39},{ “创建者”:“GIS_DB”,“创建日期”:“2012 年 3 月 8 日 10:44:00 AM","Id":1638,"Latitude":32.76004333,"Longitude":-97.34012121,"ModifiedBy":"","ModifiedDate":"","SortOrder":2,"TrailId":39}]} ,{"CreatedBy":"GIS_DB","CreatedDate":"3/8/2012 10:44:00 AM","Id":40,"ModifiedBy":"","ModifiedDate":"","Name":"CF-40","StatusId":1,"TrailCoordinates":[{"CreatedBy":" GIS_DB","创建日期":"2012 年 3 月 8 日 10:44:00 AM","Id":3755,"Latitude":32.76034332,"Longitude":-97.3402069,"ModifiedBy":"","ModifiedDate":"","SortOrder":1,"TrailId":40},{ “创建者”:“GIS_DB”,“创建日期”:“2012 年 3 月 8 日 10:44:00 AM","Id":3756,"Latitude":32.76019181,"Longitude":-97.3402448,"ModifiedBy":"","ModifiedDate":"","SortOrder":2,"TrailId":40}]} ]

这些是我的课...

public class Trails
{
    [MonoTouch.Foundation.Preserve]
    public Trails(){ TrailCoord = new List<trailcoords>();}

    [MonoTouch.Foundation.Preserve, JsonProperty("Name")]
    public string TrailName { get; set; }

    [MonoTouch.Foundation.Preserve, JsonProperty("StatusId")]
    public int StatusId { get; set; }

    [MonoTouch.Foundation.Preserve, JsonProperty("TrailCoordinates")]
    public List<trailcoords> TrailCoord { get; set; }
//  public trailcoords 

public Trails (string trailname, int statusid, List<trailcoords> trailcoord)
{
    TrailName = trailname;
        StatusId = statusid;
        TrailCoord = trailcoord;
    }       
}

public class trailcoords
{       
        [MonoTouch.Foundation.Preserve]
    public trailcoords(){}  
[MonoTouch.Foundation.Preserve, JsonProperty("TrailId")]
    public string TrailId { get; set; }     

    [MonoTouch.Foundation.Preserve, JsonProperty("Latitude")]
    public double Latitude { get; set; }    
[MonoTouch.Foundation.Preserve, JsonProperty("Longitude")]
    public double Longitude { get; set; }   

public trailcoords (string trailid, double latitude, double longitude)
{
    TrailId = trailid;
        Latitude = latitude;
        Longitude = longitude;
    }
}

List<Trails> Posts = JsonConvert.DeserializeObject<List<Trails>> ( json );

所以从这里我不确定如何访问列表中的纬度和经度项目。我可以访问 TrailName 之类的东西没问题,但不确定我在数组中的数组中的项目做错了什么。我想添加它们,以便我可以将它们绘制为类似于我制作的结构中的线条(硬编码值):

CLLocationCoordinate2D[] tmpTrail1 = new CLLocationCoordinate2D[]{
  new CLLocationCoordinate2D(32.751531, -97.361755),
  new CLLocationCoordinate2D(32.751451, -97.356625),
  new CLLocationCoordinate2D(32.751500, -97.332077),
};

CLLocationCoordinate2D[] tmpTrail2 = new CLLocationCoordinate2D[] {
  new CLLocationCoordinate2D(32.727353, -97.361139),
  new CLLocationCoordinate2D(32.747731, -97.359896),
  new CLLocationCoordinate2D(32.765735, -97.360360),
};

_trailOverlayPoints = new List<CLLocationCoordinate2D[]>();
_trailOverlayPoints.Add(tmpTrail1);
_trailOverlayPoints.Add(tmpTrail2);

【问题讨论】:

    标签: c# iphone xamarin.ios json.net


    【解决方案1】:

    我不会声明很多类,而是按如下方式解析 json 字符串

    JArray jArr = (JArray)JsonConvert.DeserializeObject(jsonstr);
    foreach (var item in jArr)
    {
        foreach(var subitem in item["TrailCoordinates"])
        {
            Console.WriteLine(subitem["Longitude"] + " " + subitem["Latitude"]);
        }
    }
    

    如果monotouch支持dynamic你也可以写

    dynamic jArr2 = JsonConvert.DeserializeObject(jsonstr);
    foreach (dynamic item in jArr2)
    {
        foreach (var subitem in item.TrailCoordinates)
        {
            Console.WriteLine(subitem.Longitude + " " + subitem.Latitude);
        }
    }
    

    你甚至可以使用 Linq

    JArray jArr = (JArray)JsonConvert.DeserializeObject(jsonstr);
    var coords = jArr
                .Select(x => x["TrailCoordinates"])
                .SelectMany(x=>x)
                .Where(x => x["TrailId"].ToString() == "40")
                .Select(x => new { Lat = double.Parse(x["Latitude"].ToString()), Lon=double.Parse(x["Longitude"].ToString()) })
                .ToArray();
    

    【讨论】:

    • 谢谢,太好了!使用 Linq 是否可以放入“where”子句,以便它只返回特定路径的坐标?
    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多