Я пытаюсь создать вывод 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 для сериализации объектов в требуемом формате.
Просьба уточнить. Вопрос, кажется, задает вопрос о сериализации (dto to json), но код показывает десерилизацию.Какую библиотеку или какой код вы используете для сериализации? –
Спасибо Том, я должен был указать, я использую Web API 2 для сериализации этих DTO обратно к клиенту. –