简体   繁体   English

如何将jArray转换为jobject

[英]how to transform jArray into jobject

I'm using Newtonsoft.Json lib with C# and encountered a problem. 我在C#中使用Newtonsoft.Json lib,遇到了问题。 I have a jArray as below: 我有一个jArray如下:

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

and I want it to be transformed as a jObject as below: 我希望将其转换为jObject,如下所示:

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

Here want I need is a general method that can handle this type of transformation. 这里我需要一个可以处理这种类型转换的通用方法。 Which means this method could also do the trick even if the jArray has a 3rd level property. 这意味着即使jArray具有3rd属性,此方法也可以解决问题。 eg 例如

from

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

to

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

Thanks a lot! 非常感谢!

EXTREMELY quick and dirty - with vast room for improvement, but this will get it done: 快速又肮脏-尚有很大的改进空间,但这可以做到:

Use like this: 像这样使用:

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"); 

With this implementation: 通过此实现:

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)));
    }
}

Prints: 印刷品:

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

Search for Newtonsoft in NuGet and download JSON.Net for this to work 在NuGet中搜索Newtonsoft并下载JSON.Net以使其工作

I have encountered the same problem using java. 我在使用Java时遇到了同样的问题。 Currently, the solution from my side is to traversal the initial ArrayJSON, then figure out the wanted format. 当前,从我这边来看,解决方案是遍历初始的ArrayJSON,然后找出所需的格式。

You can define Type1 as a model, List as the member variable, same operation with Type2 using Type3, this will help make your code easy to be organised. 您可以将Type1定义为模型,将List定义为成员变量,使用Type3与Type2进行相同的操作,这将有助于使代码易于组织。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM