如何使用ServiceStack.Text解析多维JSON数组?

时间:2013-12-18 14:52:29

标签: c# json multidimensional-array servicestack servicestack-text

我看过this post,但现在我在使用它时遇到了麻烦。

鉴于以下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 个答案:

答案 0 :(得分: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);
            }
        }
    }
}

我希望这会有所帮助。