将JSON数组转换为JSON对象

时间:2014-03-25 09:37:41

标签: c# json linq json.net

我正在尝试将JSON数组转换为Object。这是一种被黑客攻击的方式,但足以达到我的目的。

基本上我正在写一个方法来获得这个

var data = [{
    "MonthYearShortName": "Sep-13",
        "TotalCustomers": 1905.0,
        "Aquisition": 317.0,
        "Attrition": 9.0
}, {
    "MonthYearShortName": "FY-14",
        "TotalCustomers": 2158.0,
        "Aquisition": 401.0,
        "Attrition": 15.0909090909091
}]

这样的事情

data = [{
    key: 'Attrition',
    color: '#d62728',
    values: [{
        "label": "Sep-13",
        "value": 9
    }, {
        "label": "FY-14",
            "value": 15.0909090909091
    }]
},

{
    key: 'Total Customer',
    color: '#1f77b4',
    values: [{
        "label": "Sep-13",
        "value": 1905
    }, {
        "label": "FY-14",
        "value": 2158
    }]
},

{
    key: 'Aquisition',
    color: '#1f7774',
    values: [{
         "label": "Sep-13",
         "value": 317
    }, {
            "label": "FY-14",
            "value": 401
    }]
}

];

现在颜色将是静态的。我稍后会处理它。

现在开始以我的黑客方式得到这个(我知道这很粗糙)

我试过这样的事情来解决这个问题

 var data = @"[{""MonthYearShortName"": ""Sep-13"",""TotalCustomers"": 1905.0,""Aquisition"": 317.0,""Attrition"": 9.0}, {""MonthYearShortName"": ""FY-14"",""TotalCustomers"": 2158.0,""Aquisition"": 401.0,""Attrition"": 15.0909090909091}]";
                JArray a = JArray.Parse(data);

                var label1 = a[0]["MonthYearShortName"].ToString();
                var label2 = a[1]["MonthYearShortName"].ToString();
                var totalCustomer1 = a[0]["TotalCustomers"].ToString();
                var totalCustomer2 = a[1]["TotalCustomers"].ToString();
                var aquisition1 = a[0]["Aquisition"].ToString();
                var aquisition2 = a[1]["Aquisition"].ToString();
                var attrition1 = a[0]["Attrition"].ToString();
                var attrition2 = a[1]["Attrition"].ToString();
JObject rss1 =
                new JObject(
                    new JProperty("channel",
                        new JObject(
                            new JProperty("Key", "Attrition"),
                            new JProperty("color", "#d62728"),
                            new JProperty("values",
                                new JArray(
                                    from p in a
                                    select new JObject(
                                        new JProperty("label", a[0]["MonthYearShortName"].ToString()),
                                        new JProperty("value", attrition1),
                                        new JProperty("label", a[1]["MonthYearShortName"].ToString()),
                                        new JProperty("value", attrition2)))))));

当我尝试这个时,我得到了一个

Can not add property label to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object.

现在如果有人可以建议一种更清洁的方式(因为我现在无法想到),我会很高兴,或者如果我的代码可以纠正,那将会有所帮助。

由于

1 个答案:

答案 0 :(得分:1)

你能尝试这样做吗?

[Test]
public void Test()
{
    var data = @"[
            {'MonthYearShortName': 'Sep-13','TotalCustomers': 1905.0,'Aquisition': 317.0,'Attrition': 9.0},
            {'MonthYearShortName': 'FY-14','TotalCustomers': 2158.0,'Aquisition': 401.0,'Attrition': 15.0909090909091}
            ]";
    dynamic jarr = JArray.Parse(data);

    var attritions = new List<ExpandoObject>();
    var aquisitions = new List<ExpandoObject>();
    var totalCustomers = new List<ExpandoObject>();

    foreach (dynamic o in jarr)
    {
        dynamic attr = new ExpandoObject();
        attr.label = o.MonthYearShortName;
        attr.value = o.Attrition;

        attritions.Add(attr);

        dynamic acq = new ExpandoObject();
        acq.label = o.MonthYearShortName;
        acq.value = o.Aquisition;
        aquisitions.Add(acq);

        dynamic cust = new ExpandoObject();
        cust.label = o.MonthYearShortName;
        cust.value = o.TotalCustomers;
        totalCustomers.Add(acq);

    }


    dynamic attrition = new ExpandoObject();
    dynamic aquisition = new ExpandoObject();
    dynamic totalCustomer = new ExpandoObject();

    attrition.Key = "Attrition";
    attrition.Color = "#d62728";
    attrition.Values = attritions;

    aquisition.Key = "Acquisition";
    aquisition.Color = "#1f7774";
    aquisition.Values = aquisitions;

    totalCustomer.Key = "Total Customer";
    totalCustomer.Color = "#1f77b4";
    totalCustomer.Values = totalCustomers;

    var result = new[] { attrition,totalCustomer, aquisition };
    var resultString = JsonConvert.SerializeObject(result, Formatting.Indented);
    Console.Write(resultString);
}