我在C#中使用Newtonsoft.Json
lib并遇到问题。我有一个jArray如下:
[{"category": "computer","subcat": "desktop"},
{"category": "category","subcat": "laptop"},
{"category": "television","subcat": "LCD"}]
我想将它转换为jObject,如下所示:
{"computer": ["desktop","laptop"],
"television": ["LCD"]}
这里我想要的是一种可以处理这种转换的通用方法。这意味着即使jArray具有第3级属性,此方法也可以执行此操作。 e.g。
来自 的
以 非常感谢![{"typeA":"a","typeB":"a1","typeC":"a11"},{"typeA":"a","typeB":"a1","typeC":"a12"},
{"typeA":"a","typeB":"a2","typeC":"a21"}]
{"a":{"a1":["a11","a12"],"a2":["a21"]}}
答案 0 :(得分:1)
非常快速和肮脏 - 有很大的改进空间,但这将完成它:
像这样使用:
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
以使其正常工作
答案 1 :(得分:0)
我在使用java时遇到了同样的问题。 目前,我方面的解决方案是遍历最初的ArrayJSON,然后找出想要的格式。
您可以将Type1定义为模型,将List定义为成员变量,使用Type3将Type2定义为相同的操作,这将有助于使您的代码易于组织。