创建JSON字符串的问题

时间:2017-07-03 17:08:27

标签: c# .net json

我的大脑没有工作,我正在努力制造比我想象的更难的东西,我需要另一套眼睛。我在文本文件中有以下内容

|TS|170702/2300|170703/0503|42.80 -102.64 39.76 -102.64 39.44 -99.37 42.48 -99.37
|TS|170703/0505|170703/0905|40.22 -97.30 38.63 -97.30 38.19 -101.03 39.78 -101.03

以上是什么意思...(| watchtype | watchstart | watchend | lat / long pair)

我遇到的问题是我需要采取EACH ROW(可能是0或者可能是100+)并在地图上创建一个多边形以标记这些风暴手表的位置。我目前有以下内容。

MODEL

public class WatchPolygons
{
    public string WatchType { get; set; }
    public string WatchStart { get; set; }
    public string WatchEnd { get; set; }
    public List<lat_longPairs> Lat_Long_Pairs {get; set;}
}

public class lat_longPairs
{
    public decimal latitude { get; set; }
    public decimal longitude { get; set; }
}

CONTROLLER

public JsonResult GetWatchPath()
{
    var watchFilePaths = ConfigurationManager.AppSettings["watchFilePath"];
    return Json(Directory.GetFiles(Server.MapPath(watchFilePaths), "current*.txt"), JsonRequestBehavior.AllowGet);
}

[HttpGet]
public ActionResult GetWatchData(string watchPath)
{
    var stringData = new List<string>();
    using (var reader = new StreamReader(watchPath))
    {
        while (!reader.EndOfStream)
        {
            var data = reader.ReadLine().Trim();

            if (!string.IsNullOrEmpty(data))
                stringData.Add(data);
        }

    }

    return Json((from item in stringData
                 select item.Split(new char [] { '|' }, StringSplitOptions.RemoveEmptyEntries)
                into rawData
                 select new WatchPolygons
                 {
                     WatchType = rawData[0],
                     WatchStart = rawData[1],
                     WatchEnd = rawData[2]
                 }).ToList(), JsonRequestBehavior.AllowGet);
}

我知道我错过了latlong pairs = rawData。我在代码中没有它,因为在模型中它是一个列表,我不能轻易地将列表转换为我需要的字符串。

我错过了什么?我相信我需要读取每一行然后读取每个组以获得纬度/经度对。只是不确定。

2 个答案:

答案 0 :(得分:4)

你只需要解析rawData[3],其中包含空格分隔的lat / lon对的字符串。这是一个天真的实现,当输入字符串不包含数字对或当前语言环境不使用点作为小数分隔符时将会中断:

private static List<lat_longPairs> ParseLatLon(string input)
{
    var numbers = input.Split(new [] { " " }, StringSplitOptions.RemoveEmptyEntries)
                       .Select(i => decimal.Parse(i))
                       .ToArray();

    var latLonPairs = new List<lat_longPairs>();

    for (int i = 0; i < numbers.Length; i += 2)
    {
        latLonPairs.Add(new lat_longPairs
        {
            latitude = numbers[i],
            longitude = numbers[i + 1],
        });
    }

    return latLonPairs;
}

然后从投影多边形的地方调用它:

select new WatchPolygons
{
    WatchType = rawData[0],
    WatchStart = rawData[1],
    WatchEnd = rawData[2],
    Lat_Long_Pairs = ParseLatLon(rawData[3])
}

您可能希望将解析代码也从控制器移到自己的类中。

答案 1 :(得分:0)

你可以使用GroupBy,因为两个set是一个坐标。

        var str = "|TS|170702/2300|170703/0503|42.80 -102.64 39.76 -102.64 39.44 -99.37 42.48 -99.37";  
        int itemsInGroup = 2;
        var pairs = str.Split('|')[4].Split(' ').
                    // Give each set of coordinate a group number.
                    Select((n, i) => new { GroupNumber = i / itemsInGroup, Number = n }).
                    GroupBy(n => n.GroupNumber).
                    Select(g => 
                    {
                        var coordinate = g.Select(n => n.Number).ToList();
                        return new lat_longPairs
                        {
                            latitude = decimal.Parse(coordinate[0], NumberFormatInfo.InvariantInfo),
                            longitude = decimal.Parse(coordinate[1], NumberFormatInfo.InvariantInfo),
                        };
        });