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
Post a Comment