0

Я читал this post, но теперь у меня проблемы с его использованием для моей ситуации.Как обработать многомерный массив JSON с помощью ServiceStack.Text?

Учитывая следующую строку Google Maps JSON (я использую структуру данных, используемых в Blitzmap.js):

{ 
    "zoom":12, 
    "overlays":[ 
     { 
     "type": "polygon", 
     "paths":[ 
      [ 
       { "lat":52.06630340325415, "lng":5.749811642494365 }, 
       { "lat":52.066277072534014, "lng":5.758523457374736 }, 
       { "lat":52.06306460782621, "lng":5.758544915046855 }, 
       { "lat":52.063011942539184, "lng":5.749811642494365 } 
      ] 
     ] 
     } 
    ], 
    "center":{ "lat":52.06465767289667, "lng":5.75417827877061 } 
} 

При использовании Newtonsoft.JSON я мог сделать:

dynamic mapObjectsAsDynamic = (JObject)formPostedData.MapObjects; 
foreach (var overlay in mapObjectsAsDynamic.overlays) 
{ 
    if (overlay.type == "polygon") 
    { 
     foreach (var pathpart in overlay.paths) 
     { 
      foreach (var pathItem in pathpart.Children()) 
      { 
       ... = pathItem.lat; 
       ... = pathItem.lng; 
      } 
     } 
    } 
} 

Теперь мне нравится использовать ServiceStack-х JSON (ServiceStack.Text), но я застрял на paths.

Я пробовал:

var mapObjectsAsJsonObject = JsonObject.Parse(request.MapObjects); 
var trial1 = mapObjectsAsJsonObject.ArrayObjects("overlays"); 
var trial2 = trial1[0].ArrayObjects("paths"); 

Есть ли подобный Newtonsoft путь?

ответ

1

Вы можете использовать метод расширения .JsonTo<T>, чтобы преобразовать paths ключ в Point[][], после чего вы можете легко пересечь коллекцию.

Простой Point класс:

public class Point 
{ 
    public float lat { get; set; } 
    public float lng { get; set; } 
} 

Использование (хранится как аналог вашего использования в Json.NET)

var mapObjects = JsonObject.Parse(request.MapObjects); 

foreach(var overlay in mapObjects.ArrayObjects("overlays")) 
{ 
    if(overlay.Get("type")=="polygon") 
    { 
     foreach(var pathPart in overlay.JsonTo<Point[][]>("paths")) 
     { 
      foreach(var pathItem in pathPart) 
      { 
       Console.WriteLine(pathItem.lat); 
       Console.WriteLine(pathItem.lng); 
      } 
     } 
    } 
} 

Я надеюсь, что это помогает.

+0

Снова поможет Скотту! Он работает безупречно. Для нормальной службы Rest у меня был бы созданный класс запроса спуска. В моей первой версии я обрабатывал это выше на клиенте, но для большего количества (lat, png) точек в сочетании с услугами геокодирования Googles вам необходимо обработать его на сервере. – Stackbever

+0

@Stackbever Хорошо, что это сработало. Да, я видел исключительно большие наборы данных, которые вы можете получить с картами Google, геокодирование на стороне сервера имеет смысл. Удачи вам в проекте ServiceStack. – Scott

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