【问题标题】:what is the best way to generate json from C#从 C# 生成 json 的最佳方法是什么
【发布时间】:2011-06-28 12:36:50
【问题描述】:

我试图模仿他们使用硬编码 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# 中生成上述内容的最佳方法有什么建议吗?

【问题讨论】:

  • DataContractJsonSerializer(内置)或 Json.net
  • 在我看来,答案取决于更多信息。例如,您是否使用 ASP.NET MVC、WFC 或 ASMX Web 服务。您使用哪个 .NET 版本?
  • @Oleg - 这是用于 MVC,因为我正在尝试使用 jqgrid Treegrid。你有treegrid和asp.net-mvc的例子吗(假设你是专家:))
  • 我主要使用本地数据的树形网格。如果是远程数据,您应该只生成具有附加隐藏列值的数据。见the answerhere。了解loaded 列的含义并了解jqGrid 树网格不支持分页 很重要。

标签: c# .net asp.net-mvc json jqgrid


【解决方案1】:

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 } }
      }
    } 
  );
}

【讨论】:

  • +!如果创建可序列化的类是多余的,那么它非常适合一次性的事情。也最接近 JS 等价物。
【解决方案2】:

.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"]}

如果您打算使用 Web 服务生成对客户端的 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);
}

【讨论】:

  • 3.5+,似乎。但是,仍然不需要外部废话。
  • 谢谢,我认为这是一个 2.0+ 的包含,但现在我想它确实与 3.0 的其他 System.web.extension 类一起出现。干杯。
【解决方案3】:

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

["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));

【讨论】:

    【解决方案4】:
    class Row {
       public int id {get;set;}
       public object[] cell {get;set;}
    }
    
    class Data {
      public int page {get;set;}
      public int total {get;set;}
      public int records {get;set;}
      public Row[] rows {get;set;}
    }
    
    var myData = new Data(){ .... };
    var json =  new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(myData);
    

    【讨论】:

    • 那些类不可序列化
    • 它们不需要可序列化。因为这没有使用二进制序列化或 json 数据契约。它使用不处​​理可序列化属性的 Json 序列化
    猜你喜欢
    • 2013-06-13
    • 2012-03-17
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2017-01-27
    相关资源
    最近更新 更多