C# 从C生成json的最佳方法是什么#

C# 从C生成json的最佳方法是什么#,c#,.net,asp.net-mvc,json,jqgrid,C#,.net,Asp.net Mvc,Json,Jqgrid,我试图模拟一个示例,其中他们使用硬编码的JSON { "page": 1, "total": 1, "records": 2, "rows": [ {"id": 1, "cell": ["1", "Super Item", "300", 0, null, false, false]}, {"id": 2, "cell": ["2", "Item 1", "100", 1, 1, false, false]}, {"id": 3, "cell": ["3", "S

我试图模拟一个示例,其中他们使用硬编码的JSON

{
"page": 1,
"total": 1,
"records": 2,
"rows": [
   {"id": 1, "cell": ["1", "Super Item", "300", 0, null, false, false]},
       {"id": 2, "cell": ["2", "Item 1", "100", 1, 1, false, false]},
       {"id": 3, "cell": ["3", "Sub Item 1", "50", 2, 2, true, true]},
       {"id": 4, "cell": ["4", "Sub Item 2", "25", 2, 2, false, false]},
       {"id": 5, "cell": ["5", "Sub-sub Item 1", "25", 3, 4, true, true]},
       {"id": 6, "cell": ["6", "Sub Item 3", "25", 2, 2, true, true]},
       {"id": 7, "cell": ["7", "Item 2", "200", 1, 1, false, false]},
       {"id": 8, "cell": ["8", "Sub Item 1", "100", 2, 7, false, false]},
       {"id": 9, "cell": ["9", "Sub-sub Item 1", "50", 3, 8, true, true]},
       {"id": 10, "cell": ["10", "Sub-sub Item 2", "50", 3, 8, true, true]},
       {"id": 11, "cell": ["11", "Sub Item 2", "100", 2, 7, true, true]}
    ]
} 

但我需要从C#生成这个。对于在C#中生成上述内容的最佳方法,是否有任何建议?

在.Net 2+中内置了一个名为“JavaScriptSerializer”的类,该类基于.Net类型的类创建JSON结构化字符串

使用序列化程序,您可以简单地创建一个具有属性和集合的类来表示JSON数据。在.Net服务器端代码中创建它的实例,然后使用序列化程序进行响应,以生成有效的JSON字符串响应

下面是一个将Person类实例转换为序列化JSON字符串的示例

JavaScriptSerializer js = new JavaScriptSerializer();
Person p1 = new Person();
p1.firstName = "Brian";
p1.lastName = "Scott";
p1.department = "Microsoft";
p1.address.addressline1 = "Microsoft";
p1.address.addressline2 = "";
p1.address.city = "Redmond";
p1.address.state = "Seattle";
p1.address.country = "America";
p1.address.pin = 560028;
p1.technologies = new string[] { "IIS", "ASP.NET", "JavaScript", "AJAX" };

string strJSON = js.Serialize(p1);
这将生成一个有效的JSON字符串

{"firstName":"Brian","lastName":"Scott","department":"Microsoft","address":{"addressline1":"Microsoft","addressline2":"","city":"Redmond","state":"Seattle","country":"America","pin":560028},"technologies":["IIS","ASP.NET","JavaScript","AJAX"]}
如果您打算使用webservice向客户端生成JSON响应,那么您可以将您的方法标记为

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetPersonJSON()
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    Person p1 = new Person();
p1.firstName = "Brian";
p1.lastName = "Scott";
p1.department = "Microsoft";
p1.address.addressline1 = "Microsoft";
p1.address.addressline2 = "";
p1.address.city = "Redmond";
p1.address.state = "Seattle";
p1.address.country = "America";
p1.address.pin = 560028;
p1.technologies = new string[] { "IIS", "ASP.NET", "JavaScript", "AJAX" };

return js.Serialize(p1);
}

显然,您正在尝试填充jqGrid,并且正在使用ASP.NETMVC。 如果已为这些值定义了类:

["1", "Super Item", "300", 0, null, false, false]
您可以将所有元素存储在一个集合中
myCollection

您可以这样做:

var ReturnData = new
    {
        total = totalPages,
        page = page,
        records = totalRecords,
        rows = myCollection.Select(r => new
        {
            id = r.Id.ToString(),
            cell = new String[] { r.Field1, r.Field2, r.Field3, r.Field4 }
        })
        };

return (Json(ReturnData, JsonRequestBehavior.DenyGet));

Controller
类有一个将对象序列化为Json的
Json
方法,因此在操作方法中,您只需创建对象并调用该方法:

public ActionResult GetData() {
  return Json(
    new {
      page = 1,
      total = 1,
      records = 2,
      rows = new[] {
        new { id = 1, cell = new object[] { "1", "Super Item", "300", 0, null, false, false } },
        new { id = 2, cell = new object[] { "2", "Item 1", "100", 1, 1, false, false } },
        new { id = 3, cell = new object[] { "3", "Sub Item 1", "50", 2, 2, true, true } },
        new { id = 4, cell = new object[] { "4", "Sub Item 2", "25", 2, 2, false, false } },
        new { id = 5, cell = new object[] { "5", "Sub-sub Item 1", "25", 3, 4, true, true } },
        new { id = 6, cell = new object[] { "6", "Sub Item 3", "25", 2, 2, true, true } },
        new { id = 7, cell = new object[] { "7", "Item 2", "200", 1, 1, false, false } },
        new { id = 8, cell = new object[] { "8", "Sub Item 1", "100", 2, 7, false, false } },
        new { id = 9, cell = new object[] { "9", "Sub-sub Item 1", "50", 3, 8, true, true } },
        new { id = 10, cell = new object[] { "10", "Sub-sub Item 2", "50", 3, 8, true, true } },
        new { id = 11, cell = new object[] { "11", "Sub Item 2", "100", 2, 7, true, true } }
      }
    } 
  );
}

看起来是3.5+。但是,仍然不需要外部的废话。谢谢,我以为这是一个2.0+的包含,但现在我想起来了,这个类确实与其他3.0的System.web.extension类一起出现了。干杯。那些类不是可序列化的,它们不需要可序列化。因为这不是使用二进制序列化或json datacontract。它使用的是Json序列化,它不处理可序列化属性+!如果创建可序列化类的工作过于繁重,那么这对于一次性工作来说是非常好的。也最接近JS等效值。看看
DataContractJsonSerializer
(内置)或Json.netIt在我看来,答案取决于更多信息。例如,您是否使用ASP.NET MVC、WFC或ASMX web服务。您使用哪个.NET版本?@Oleg-这是针对MVC的,因为我正在尝试使用jqgrid Treegrid。你有treegrid和asp.net-mvc的例子吗(假设你是专家:)我使用的树网格主要是本地数据。对于远程数据,您应该只生成具有附加隐藏列值的数据。见和。理解
loaded
列的含义以及jqGrid树不支持分页是很重要的。
public ActionResult GetData() {
  return Json(
    new {
      page = 1,
      total = 1,
      records = 2,
      rows = new[] {
        new { id = 1, cell = new object[] { "1", "Super Item", "300", 0, null, false, false } },
        new { id = 2, cell = new object[] { "2", "Item 1", "100", 1, 1, false, false } },
        new { id = 3, cell = new object[] { "3", "Sub Item 1", "50", 2, 2, true, true } },
        new { id = 4, cell = new object[] { "4", "Sub Item 2", "25", 2, 2, false, false } },
        new { id = 5, cell = new object[] { "5", "Sub-sub Item 1", "25", 3, 4, true, true } },
        new { id = 6, cell = new object[] { "6", "Sub Item 3", "25", 2, 2, true, true } },
        new { id = 7, cell = new object[] { "7", "Item 2", "200", 1, 1, false, false } },
        new { id = 8, cell = new object[] { "8", "Sub Item 1", "100", 2, 7, false, false } },
        new { id = 9, cell = new object[] { "9", "Sub-sub Item 1", "50", 3, 8, true, true } },
        new { id = 10, cell = new object[] { "10", "Sub-sub Item 2", "50", 3, 8, true, true } },
        new { id = 11, cell = new object[] { "11", "Sub Item 2", "100", 2, 7, true, true } }
      }
    } 
  );
}