使用linq将json字符串解析为对象

MUG4N

在我的应用程序中,我想显示一个文件夹及其包含的书签。我尝试实现以下目标:

  • 文件夹维基百科
    • 网址a
    • 网址b
    • 网址...
  • 文件夹StackOverflow
    • 网址a
    • 网址b

因此,我必须解析以下json字符串:

{
       "checksum": "7d7205349eb64a4894aafc5ce074c0c0",
       "roots": {
          "bookmark_bar": {
             "children": [ {
                "children": [ {
                   "date_added": "13021579661026871",
                   "id": "28",
                   "name": "design patterns - Do you allow the Web Tier to access the DAL directly? - Stack Overflow",
                   "type": "url",
                   "url": "http://stackoverflow.com/questions/796656/do-you-allow-the-web-tier-to-access-the-dal-directly"
                }, {
                   "date_added": "13021665700468056",
                   "id": "31",
                   "name": "VS 2010 Error when creating or opening projects - Stack Overflow",
                   "type": "url",
                   "url": "http://stackoverflow.com/questions/8403853/vs-2010-error-when-creating-or-opening-projects"
                } ],
                "date_added": "13021579680308871",
                "date_modified": "13024947520078515",
                "id": "29",
                "name": "StackOverflow",
                "type": "folder"
             }, {
                "children": [ {
                   "date_added": "13022096980978880",
                   "id": "45",
                   "name": "Dependency injection - Wikipedia, the free encyclopedia",
                   "type": "url",
                   "url": "http://en.wikipedia.org/wiki/Dependency_injection"
                }, {
                   "date_added": "13024941326636844",
                   "id": "124",
                   "name": "Strategy pattern - Wikipedia, the free encyclopedia",
                   "type": "url",
                   "url": "http://en.wikipedia.org/wiki/Strategy_pattern"
                } ],
                "date_added": "13023315356559470",
                "date_modified": "13024946156966435",
                "id": "72",
                "name": "Wiki",
                "type": "folder"
             }, {
                "children": [ {
                   "date_added": "13023667785042757",
                   "id": "85",
                   "name": "Anemic Domain Model Illustrated | Frequent incoherent cogitation",
                   "type": "url",
                   "url": "http://vitamic.wordpress.com/2007/01/04/anemic-domain-model-illustrated/"
                } ],
                "date_added": "13023667668403520",
                "date_modified": "13023668043391377",
                "id": "82",
                "name": "#Read",
                "type": "folder"
             }, {
                "date_added": "13025102943539897",
                "id": "130",
                "name": "Modern UI for WPF - Home",
                "type": "url",
                "url": "http://mui.codeplex.com/wikipage?title=screenshots&referringTitle=Home"
             } ],
             "date_added": "13020681767991841",
             "date_modified": "13025102947408897",
             "id": "1",
             "name": "Lesezeichenleiste",
             "type": "folder"
          }
       },
       "version": 1
    }

我已经尝试了GroupBy Function,但没有成功:

    var items = jObject.Descendants()
                     .Where(x => x.Type == JTokenType.Object &&
                                 x.Value<string>("type") != null)
                     .GroupBy(x => x.Value<string>("type"));

    foreach (var item in items)
    {
        Console.WriteLine(item.Key.ToString());
        foreach (var children in item)
        {
            Console.WriteLine("    " + children.Value<string>("name"));
        }
    }

我也尝试过应用Join Function,但是我在这里缺少join属性。有人可以指出我正确的方向吗?

我会使用具体的类来解析json。

var root = JsonConvert.DeserializeObject<RootObj>(json);
Print(root.roots.bookmark_bar,"");
void Print(Node n,string padding)
{
    Console.WriteLine(padding + "+" + n.name);
    foreach(var url in n.children.Where(c => c.type == "url"))
    {
        Console.WriteLine(padding + "\t-" + url.name);
    }
    foreach (var folder in n.children.Where(c => c.type == "folder"))
    {
        Print(folder, padding + "\t");
    }
}
public class Node
{
    public string date_added { get; set; }
    public string date_modified { get; set; }
    public string id { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string url { get; set; }
    public List<Node> children { get; set; }
}

public class Roots
{
    public Node bookmark_bar { get; set; }
}

public class RootObj
{
    public string checksum { get; set; }
    public Roots roots { get; set; }
    public int version { get; set; }
}

上面的代码足以解析您的json,但是如果您希望* date_modified *和* date_added *字段为DateTime,则可以实现JsonConverter类

var root = JsonConvert.DeserializeObject<RootObj>(json, new DateTimeConverter());
class DateTimeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return new DateTime(1970,1,1).Add(TimeSpan.FromTicks(long.Parse((string)reader.Value)));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

然后您的Node类将是

public class Node
{
    public DateTime date_added { get; set; }
    public DateTime date_modified { get; set; }
    public string id { get; set; }
    public string name { get; set; }
    public string type { get; set; }
    public string url { get; set; }
    public List<Node> children { get; set; }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将JSON查询字符串解析为JSON对象

来自分类Dev

将JSON查询字符串解析为JSON对象

来自分类Dev

将JSON对象解析为Java中的字符串

来自分类Dev

将字符串转换或解析为JSON对象

来自分类Dev

将 JSON 从字符串解析为对象

来自分类Dev

Nodejs - 将字符串解析为 JSON 对象

来自分类Dev

将字符串解析为对象

来自分类Dev

将字符串解析为对象

来自分类Dev

如何使用继承/多态性将JSON字符串解析为C#对象?

来自分类Dev

使用 Jackson 将 Json 字符串解析为 Kotlin 对象抛出 InvalidDefinitionException

来自分类Dev

将字符串解析为JSON

来自分类Dev

将字符串解析为JSON

来自分类Dev

将字符串解析为JSON

来自分类Dev

将字符串解析为JSON

来自分类Dev

Gson 无法将位于 json 对象中的 json 数组字符串解析为 JsonArray

来自分类Dev

将JSON字符串解析为对象数组Objective C

来自分类Dev

将包含多个json对象的字符串解析为更方便的内容

来自分类Dev

android,gson无法将json字符串解析为java对象

来自分类Dev

将NSDictionary的JSON字符串解析为对象数组Object C

来自分类Dev

android,gson无法将json字符串解析为java对象

来自分类Dev

将未标记的 JSON 字符串解析为 java 对象

来自分类Dev

将 JSON 字符串解析为具有精确值的 javascript 对象

来自分类Dev

如何将字符串解析为“标题对象”?

来自分类Dev

将字符串解析为Calendar对象

来自分类Dev

如何将字符串解析为日期对象?

来自分类Dev

如何将字符串解析为对象?

来自分类Dev

使用JSON.NET将动态JSON字符串解析为C#中的字符串

来自分类Dev

使用Linq将格式化的字符串选择为对象

来自分类Dev

使用JAXB将XML数据解析为字符串对象

Related 相关文章

热门标签

归档