0

我讀this post,但現在我遇到麻煩,因爲我的情況。如何解析使用ServiceStack.Text的多維JSON數組?

考慮下面的谷歌地圖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

再次偉大的幫助斯科特!它工作完美無瑕。對於一個正常的休息服務,我會創建一個下降請求類。在我的第一個版本中,我在客戶端上面處理了這個問題,但是對於大量(lat,png)點與Google地理編碼服務的組合,您必須在服務器上處理它。 – Stackbever

+0

@Stackbever這是很好的工作。是的,我已經看到了使用谷歌地圖可以獲得的特大數據集,服務器端地理編碼是合理的。祝你ServiceStack項目好運。 – Scott