2015-12-01 3 views
5

Я пытаюсь создать вывод JSON, который напоминает формат GeoJSON описано здесь: http://geojson.org/geojson-spec.htmlСоздание GeoJSON выход из Ну Known Text с C#

В частности, у меня есть текст возвращается из моего источника данных в текстовом формате, и хотел бы конвертируйте мои DTO в JSON в формате, показанном ниже в моих комментариях. Основная проблема, с которой я сталкиваюсь, заключается в создании массива координат [[...]] без имен свойств.

Код:

/* 

       Geometry Text Format from database: POLYGON ((319686.3666000003 7363726.7955, 319747.05190000031 7363778.9233, 319700.78849999979 7363832.7814, 319640.10329999961 7363780.6536, 319686.3666000003 7363726.7955)) 

       And we want format: 
       "geometry": { 
        "type": "Polygon", 
        "coordinates": [[ 
         [319686.3666000003, 7363726.795], 
         [319747.0519000003, 7363778.9233], 
         [319700.78849999979, 7363832.7814], 
         [319640.10329999961, 7363780.6536], 
         [319686.3666000003, 7363726.795] 
        ]] 
       } 

       */ 


       // Strip out everything except the coordinates 
       var coordRawText = myWkt.Replace("POLYGON ((", ""); 
       coordRawText = coordRawText.Replace("))", ""); 
       coordRawText = coordRawText.Replace(", ", ","); 

       // Seperate coordinates to iterate through 
       var coordsArray = coordRawText.Split(','); 
       var coordsEnumerable = coordsArray.Select(coord => coord.Replace(" ", ",")); 

       // Build list of coordinates 
       var coordsList = new List<CoordinateDto>(); 
       foreach (var coord in coordsEnumerable) 
       { 
        var splt = coord.Split(','); 
        var x = double.Parse(splt[0]); 
        var y = double.Parse(splt[1]); 

        coordsList.Add(new CoordinateDto {X = x, Y = y}); 
       } 

       myDto.Geometry = new GeometryDto 
       { 
        Type = "Polygon", 
        Coordinates = coordsList 
       }; 

Приведенные выше результаты "почти", что я хочу, но не совсем. Выход, как показано ниже:

"geometry":{"type":"Polygon","coordinates":[{"x":319686.3666000003,"y":7363726.7955},{"x":319747.05190000031,"y":7363778.9233},{"x":319700.78849999979,"y":7363832.7814},{"x":319640.10329999961,"y":7363780.6536},{"x":319686.3666000003,"y":7363726.7955}]} 

Мои DTOS определяются следующим образом:

[DataContract] 
public class GeometryDto 
{ 
    [DataMember] 
    public string Type { get; set; } 

    [DataMember] 
    public List<CoordinateDto> Coordinates { get; set; } 


} 


[DataContract] 
public class CoordinateDto 
{ 
    [DataMember] 
    public double X { get; set; } 

    [DataMember] 
    public double Y { get; set; } 


} 

Я пытался использовать кортежи вместо координат класса, но это просто вставить «item1» и «item2» недвижимость вместо «x» и «y».

Единственное, чего я еще не пытался создать свой собственный конвертер JSON?

Заранее спасибо за помощь,

С наилучшими пожеланиями,

Стефан

ОБНОВЛЕНИЕ НА РЕШЕНИЕ

я достиг решения благодаря выбранному ответу здесь (от Dhanuka777) о многомерные массивы, но для полноты в случае, если это помогает:

мне пришлось создать новую вспомогательную функцию (слегка модифицированной версию функции создания массива Прямоугольного Джона Скита отсюда: How to convert list of arrays into a multidimensional array)

решения кода, как показано ниже:

/* 

       Geometry Text Format from database: POLYGON ((319686.3666000003 7363726.7955, 319747.05190000031 7363778.9233, 319700.78849999979 7363832.7814, 319640.10329999961 7363780.6536, 319686.3666000003 7363726.7955)) 

       And we want format: 
       "geometry": { 
        "type": "Polygon", 
        "coordinates": [[ 
         [319686.3666000003, 7363726.795], 
         [319747.0519000003, 7363778.9233], 
         [319700.78849999979, 7363832.7814], 
         [319640.10329999961, 7363780.6536], 
         [319686.3666000003, 7363726.795] 
        ]] 
       } 

       */ 


       // Strip out everything except the coordinates 
       var coordRawText = myWkt.Replace("POLYGON ((", ""); 
       coordRawText = coordRawText.Replace("))", ""); 
       coordRawText = coordRawText.Replace(", ", ","); 

       // Seperate coordinates to iterate through 
       var coordsArray = coordRawText.Split(','); 
       var coordsEnumerable = coordsArray.Select(coord => coord.Replace(" ", ",")); 

       // Build list of coordinates 
       var coordsList = new List<double[,]>(); 
       foreach (var coord in coordsEnumerable) 
       { 
        var splt = coord.Split(','); 
        var x = double.Parse(splt[0]); 
        var y = double.Parse(splt[1]); 

        coordsList.Add(new[,] {{ x, y }}); 
       } 

       myDto.Geometry = new GeometryDto 
       { 
        Type = "Polygon", 
        Coordinates = CreateRectangularArray(coordsList) 
       }; 

и слегка измененную версию прямоугольного определение массива, как показано ниже:

static T[,] CreateRectangularArray<T>(IList<T[,]> arrays) 
     { 
      // TODO: Validation and special-casing for arrays.Count == 0 
      int minorLength = arrays[0].Length; 
      T[,] ret = new T[arrays.Count, minorLength]; 
      for (int i = 0; i < arrays.Count; i++) 
      { 
       var array = arrays[i]; 
       if (array.Length != minorLength) 
       { 
        throw new ArgumentException 
         ("All arrays must be the same length"); 
       } 
       for (int j = 0; j < minorLength; j++) 
       { 
        ret[i, j] = array[0, j]; 
       } 
      } 
      return ret; 
     } 

И обновленный GeometryDto следующим образом:

[DataContract] 
    public class GeometryDto 
    { 
     [DataMember] 
     public string Type { get; set; } 

     [DataMember] 
     public double[,] Coordinates { get; set; } 


    } 

Web API будет использовать Newtonsoft Json для сериализации объектов в требуемом формате.

+0

Просьба уточнить. Вопрос, кажется, задает вопрос о сериализации (dto to json), но код показывает десерилизацию.Какую библиотеку или какой код вы используете для сериализации? –

+0

Спасибо Том, я должен был указать, я использую Web API 2 для сериализации этих DTO обратно к клиенту. –

ответ

1

Я предпочел бы использовать сериализатор Newtonsoft Json, чтобы получить это. Определенные координаты как 2D-массив сделают трюк.

public class GeometryDto 
    { 
     public string Type { get; set; } 

     public double[,] coordinates { get; set; }    

    } 

    class Program 
    { 
     static void Main() 
     { 
      var obj = new GeometryDto 
      { 
       Type = "Polygon", 
       coordinates = new double[,] { { 319686.3666000003, 7363726.795 }, { 319747.0519000003, 7363778.9233 }, { 5.3434444, 6.423443 }, { 7.2343424234, 8.23424324 } }      
      }; 
      var json = Newtonsoft.Json.JsonConvert.SerializeObject(obj); 
      Console.WriteLine(json); 
      Console.ReadKey(); 
     } 
    } 

Получите Nuget отсюда.

Выход: { "Тип": "Полигон", "координаты": [[319686.3666000003,7363726.795], [319747.05190000031,7363778.9233], ...]}

+0

Большое спасибо Dhanuka777, совет для многомерного двойного массива привел меня к рабочему ответу. –

+0

Я обновил вопрос о том, как я реализовал это с помощью предложения многомерного массива, если он помогает кому-то другому. благодаря –

Смежные вопросы