如何将jArray转换为jobject

时间:2015-09-26 07:28:20

标签: c# json

我在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"]}}

非常感谢!

2 个答案:

答案 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定义为相同的操作,这将有助于使您的代码易于组织。