如何将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"]}}
非常感谢!
非常快和脏-有很大的改进空间,但这将完成:
像这样使用:
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操作相同,这将有助于使您的代码易于组织。