c# - how to transform jArray into jobject -


i'm using newtonsoft.json lib c# , encountered problem. have jarray below:

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

and want transformed jobject below:

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

here want need general method can handle type of transformation. means method trick if jarray has 3rd level property. e.g.

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 lot!

extremely quick , dirty - vast room improvement, done:

use 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 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() 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 newtonsoft in nuget , download json.net work


Comments