如何将jArray转换为jobobject

本文关键字:jobobject 转换 jArray | 更新日期: 2023-09-27 18:14:40

我在c#中使用Newtonsoft.Json库,遇到了一个问题。我有一个jArray如下:

[{"category": "computer","subcat": "desktop"},
 {"category": "category","subcat": "laptop"},
 {"category": "television","subcat": "LCD"}]

,我想把它转换成一个对象,如下所示:

{"computer": ["desktop","laptop"],
 "television": ["LCD"]}

这里我需要的是一个通用的方法,可以处理这种类型的转换。这意味着即使jArray有一个第三级属性,这个方法也可以做到这一点。例如

[{"typeA":"a","typeB":"a1","typeC":"a11"},{"typeA":"a","typeB":"a1","typeC":"a12"},
 {"typeA":"a","typeB":"a2","typeC":"a21"}]

{"a":{"a1":["a11","a12"],"a2":["a21"]}}

非常感谢!

如何将jArray转换为jobobject

非常快和脏-有很大的改进空间,但这将完成:

像这样使用:

var input = @"[{""type"":""a"",""typeB"":""a1"",""typeC"":""a11""},
               {""type"":""a"",""typeB"":""a1"",""typeC"":""a12""},
               {""type"":""a"",""typeB"":""a2"",""typeC"":""a21""}]";
var b = JsonConvert.DeserializeObject<List<tmp>>(input);
var result = doIt(b, "type", "typeB", "typeC"); 

使用这个实现:

private string doIt(IEnumerable<tmp> objs, params string[] g)
{
    var t = CollapseOrGroup(objs,g);
    return JsonConvert.SerializeObject(t);
}
private dynamic CollapseOrGroup(IEnumerable<tmp> objs, IEnumerable<string> props) 
{
    var firstProp = props.FirstOrDefault();
    if (firstProp == default(string))
        return objs;
    var p = Expression.Parameter(typeof(tmp));
    var m = Expression.Property(p, firstProp);
    var l = Expression.Lambda(m, p).Compile() as dynamic;
    if (props.Count() == 1)
    {
        return Enumerable.Select(objs, l);
    } else {    
        IEnumerable<IGrouping<dynamic, tmp>> g = Enumerable.GroupBy(objs, l);   
        return g.ToDictionary (o => o.Key, o => CollapseOrGroup(o, props.Skip(1)));
    }
}

打印:

{"a":{"a1":["a11","a12"],"a2":["a21"]}}

在NuGet中搜索Newtonsoft并下载JSON.Net以使其工作

我在使用java时遇到过同样的问题。目前,我这边的解决方案是遍历初始的ArrayJSON,然后找出想要的格式。

可以将Type1定义为一个模型,将List定义为成员变量,与使用Type3的Type2操作相同,这将有助于使您的代码易于组织。