在C#中将对象转换为JSON [英] Convert objects to JSON in C#

查看:124
本文介绍了在C#中将对象转换为JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一堂课

public class StatististikaByCustomer
{
    public string data { get; set; } // Array or String?
    public string xkey {get;set;}
    public Array ykey {get;set;}
    public Array labels {get;set;}

}

如何获取这样的JSON?

How can I get JSON like this?

{
    "data":[
        {
            "timeinterval":"2015-10-22T00:00:00",
            "Firm":4,
            "Firm1":4,
            "Firm2":22,
            "Firm3":30,
            "Firm4":19
        },
        {
            "timeinterval":"2015-10-23T00:00:00",
            "Firm":2,
            "Firm1":5,
            "Firm2":29,
            "Firm3":34,
            "Firm4":219
        }
    ],
    "xkey":"timeinterval",
    "ykey":["Firm","Firm1","Firm2","Firm3","Firm4"],
    "labels":[" Firm","Firm1","Firm2","Firm3","Firm4"]
}

Firm不能被硬编码.一切都必须是动态的.

Firm cannot be hard coded. It all must be dynamic.

我的控制器操作:

public JsonResult StatistikaJson()
{
    ArrayList arrayList = new ArrayList();
    StatistikaByCustomer statisikaObject = new StatistikaByCustomer();           
    List<Data> listData = new List<Data>();
    string jsonTemp = null;
    DbDataReader reader = null;

    using (var cmd = db.Database.Connection.CreateCommand())
    {
        if (db.Database.Connection.State == ConnectionState.Closed)
        {
            db.Database.Connection.Open();
        }

        cmd.CommandText = "EXEC GetClientConnectsByCustomer @start='" + DateTime.Now.AddMonths(-1).Date.ToString("yyyy-MM-dd") + "',@end='" + DateTime.Now.Date.ToString("yyyy-MM-dd") + "',@interval = 24";
        reader = cmd.ExecuteReader();

        var tempYkey = Enumerable.Range(1, reader.FieldCount - 1).Select(reader.GetName).ToArray();
        statisikaObject.ykey = tempYkey.Select(x => x.Replace(" ", "")).ToArray();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                string name = reader.GetName(0);
                object value = reader.GetDateTime(0);
                listData.Add(new Data() { Name = name, Value = value });

                for (int i = 1; i < reader.FieldCount - 1; i++)
                {
                    name = reader.GetName(i).Replace(" ", "");
                    value = reader.GetInt32(i);
                    listData.Add(new Data() { Name = name, Value = value });
                }

                //arrayList.Add(JsonConvert.SerializeObject(listData.ToDictionary(x => x.Name, y => y.Value)));
                jsonTemp += JsonConvert.SerializeObject(listData.ToDictionary(x => x.Name, y => y.Value));  
                jsonTemp += ",";                             
                listData.Clear();
                //Debug.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", reader.GetName(0), reader.GetDateTime(0), reader.GetInt32(1), reader.GetInt32(2), reader.GetInt32(3), reader.GetInt32(4));   
            }
        }
        else
        {
            Debug.WriteLine("No rows found.");
        }
        statisikaObject.xkey = reader.GetName(0);
        statisikaObject.labels = Enumerable.Range(1, reader.FieldCount - 1).Select(reader.GetName).ToArray();
        reader.Close();
        //the number of affected records, if the query returns it var result = cmd.ExecuteNonQuery(); 
        //or a single scalar value //var result = cmd.ExecuteScalar(); 
        //or even a data reader var result = cmd.ExecuteReader(); 
        db.Database.Connection.Close();
    }
    statisikaObject.data =  oSerializer.Serialize(arrayList);

    //string json = JsonConvert.SerializeObject(statisikaObject);
    //string json = JsonConvert.SerializeObject(l);

    return Json(statisikaObject, JsonRequestBehavior.AllowGet);
}

我得到了JSON,但是它已转义并且morris.js不喜欢它.

I get JSON, but it's escaped and morris.js doesn't like it.

在我看来,我想这样使用它:

In my view, I would like to use it like this:

<script type="text/javascript">
    $.getJSON('@Url.Action("StatistikaJson")', function (result)
    {
        new Morris.Line({
            element: 'line-example',
            data: result.data,
            xkey: "timeinterval",
            ykeys: result.ykey,
            labels: result.labels
        });
    });
</script>

如有必要,我可以使用Json.NET.如果可能的话,我想摆脱JSON字符串附加.我想要一个数组并调用序列化来获取数据:morris.js需要的数组格式的json对象: http://jsbin.com/uqawig/441/embed?js,输出

I can use Json.NET if necessary. If posible, I would like to get ride off the JSON string appending. I would like to have an array and call serialize to get data: json objects in array format that morris.js needs: http://jsbin.com/uqawig/441/embed?js,output

{"data":"{" timeinterval:" 2015-10-22T00:00:00," Firm:4,...},{" timeinterval:" 2015-10-22T00:00 :00,"固定:5,...},...}

{"data":"{"timeinterval":"2015-10-22T00:00:00","Firm":4,...},{"timeinterval":"2015-10-22T00:00:00","Firm":5,...},...}

推荐答案

ViewModel:

ViewModel:

public class StatistikaByCustomer
{
    public ArrayList data { get; set; }
    public string xkey { get; set; }
    public List<string> ykey { get; set; }
    public List<string> labels { get; set; }
}

控制器:

public JsonResult StatistikaJson()
{
    StatistikaByCustomer statisikaObject = new StatistikaByCustomer();           
    ArrayList arrayList = new ArrayList();                  
    List<Data> listData = new List<Data>();
    DbDataReader reader = null;
    using (var cmd = db.Database.Connection.CreateCommand())
    {
        if (db.Database.Connection.State == ConnectionState.Closed)
        {
            db.Database.Connection.Open();
        }

        cmd.CommandText = "EXEC GetClientConnectsByCustomer @start='" + DateTime.Now.AddMonths(-1).Date.ToString("yyyy-MM-dd") + "',@end='" + DateTime.Now.Date.ToString("yyyy-MM-dd") + "',@interval = 24";
        reader = cmd.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {                  
                string name = reader.GetName(0);
                object value = reader.GetDateTime(0).ToString("yyyy-MM-dd");

                listData.Add(new Data() { Name = name, Value = value });

                for (int i = 1; i <= reader.FieldCount - 1; i++)
                {
                    name = reader.GetName(i).Replace(" ", "");
                    value = reader.GetInt32(i);                                               
                    listData.Add(new Data() { Name = name, Value = value });
                }

                arrayList.Add(JsonConvert.SerializeObject(listData.ToDictionary(x => x.Name, y => y.Value)));
                listData.Clear();
                //Debug.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", reader.GetName(0), reader.GetDateTime(0), reader.GetInt32(1), reader.GetInt32(2), reader.GetInt32(3), reader.GetInt32(4));   
            }               
        }                           
        statisikaObject.data = arrayList;
        statisikaObject.xkey = reader.GetName(0);
        statisikaObject.labels = Enumerable.Range(1, reader.FieldCount - 1).Select(reader.GetName).ToList();
        var tempYkey = Enumerable.Range(1, reader.FieldCount - 1).Select(reader.GetName).ToArray();
        statisikaObject.ykey = tempYkey.Select(x => x.Replace(" ", "")).ToList();
        reader.Close();    
        db.Database.Connection.Close();
    }

    return Json(statisikaObject, JsonRequestBehavior.AllowGet);
}

查看:

<script type="text/javascript">    
    $.getJSON('@Url.Action("StatistikaJson")', function (result)
    {
        new Morris.Line({
            element: 'line-example',
            data: $.parseJSON("[" + result.data + "]"),
            xkey: result.xkey,
            ykeys: result.ykey,
            labels: result.labels
    });
    });
</script>

这篇关于在C#中将对象转换为JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆