如何在C#中创buildJSONstring

我只是使用XmlWriter来创build一些XML在HTTP响应中发回。 你将如何创build一个JSONstring。 我假设你只是使用一个stringbuilder来构buildJSONstring,并将它们的响应格式设置为JSON?

你可以使用JavaScriptSerializer类 ,检查这篇文章来构build一个有用的扩展方法。

来自文章的代码:

namespace ExtensionMethods { public static class JSONHelper { public static string ToJSON(this object obj) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Serialize(obj); } public static string ToJSON(this object obj, int recursionDepth) { JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.RecursionLimit = recursionDepth; return serializer.Serialize(obj); } } } 

用法:

 using ExtensionMethods; ... List<Person> people = new List<Person>{ new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"}, new Person{ID = 2, FirstName = "Bill", LastName = "Gates"} }; string jsonString = people.ToJSON(); 

使用Newtonsoft.Json使其变得非常简单:

 Product product = new Product(); product.Name = "Apple"; product.Expiry = new DateTime(2008, 12, 28); product.Price = 3.99M; product.Sizes = new string[] { "Small", "Medium", "Large" }; string json = JsonConvert.SerializeObject(product); 

文档: 序列化和反序列化JSON

这个库对于来自C#的JSON非常有用

http://james.newtonking.com/pages/json-net.aspx

此代码片段使用.NET 3.5中的System.Runtime.Serialization.Json中的DataContractJsonSerializer。

 public static string ToJson<T>(/* this */ T value, Encoding encoding) { var serializer = new DataContractJsonSerializer(typeof(T)); using (var stream = new MemoryStream()) { using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding)) { serializer.WriteObject(writer, value); } return encoding.GetString(stream.ToArray()); } } 

查看http://www.codeplex.com/json/了解json-net.aspx项目。; 为什么重新发明轮子?

您也可以尝试我的ServiceStack JsonSerializer这是目前最快的.NET JSON序列化器 。 它支持序列化DataContracts,任何POCOtypes,接口,包括匿名types等的后期绑定对象。

基本例子

 var customer = new Customer { Name="Joe Bloggs", Age=31 }; var json = JsonSerializer.SerializeToString(customer); var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

注意:如果性能对你并不重要,那么只能使用微软的JavaScriptSerializer,因为我不得不把它从基准testing中解脱出来,因​​为它比其他JSON序列化器慢了40倍100倍

如果你不能或不想使用两个内置的JSON序列化器( JavaScriptSerializer和DataContractJsonSerializer ),你可以试试JsonExSerializer库 – 我在很多项目中使用它,并且工作得很好。

如果你需要复杂的结果(embedded式)创build你自己的结构:

 class templateRequest { public String[] registration_ids; public Data data; public class Data { public String message; public String tickerText; public String contentTitle; public Data(String message, String tickerText, string contentTitle) { this.message = message; this.tickerText = tickerText; this.contentTitle = contentTitle; } }; } 

然后你可以通过调用获得JSONstring

 List<String> ids = new List<string>() { "id1", "id2" }; templateRequest request = new templeteRequest(); request.registration_ids = ids.ToArray(); request.data = new templateRequest.Data("Your message", "Your ticker", "Your content"); string json = new JavaScriptSerializer().Serialize(request); 

结果将是这样的:

 json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}" 

希望它有帮助!

如果您尝试创build一个Web服务以通过JSON将数据提供给网页,请考虑使用ASP.NET Ajax工具包:

http://www.asp.net/learn/ajax/tutorial-05-cs.aspx

它会自动将通过web服务提供的对象转换为json,并创build可用于连接的代理类。

DataContractJSONSerializer将为您做所有事情,就像XMLSerializer一样简单。 它在web应用程序中使用它是微不足道的。 如果您正在使用WCF,您可以使用一个属性指定它的使用。 DataContractSerializer系列也非常快。

我发现你根本不需要序列化器。 如果将对象作为List返回。 让我用一个例子。

在我们的asmx中,我们使用我们传递的variables来获取数据

 // return data [WebMethod(CacheDuration = 180)] public List<latlon> GetData(int id) { var data = from p in db.property where p.id == id select new latlon { lat = p.lat, lon = p.lon }; return data.ToList(); } public class latlon { public string lat { get; set; } public string lon { get; set; } } 

然后使用jQuery我们访问服务,传递这个variables。

 // get latlon function getlatlon(propertyid) { var mydata; $.ajax({ url: "getData.asmx/GetLatLon", type: "POST", data: "{'id': '" + propertyid + "'}", async: false, contentType: "application/json;", dataType: "json", success: function (data, textStatus, jqXHR) { // mydata = data; }, error: function (xmlHttpRequest, textStatus, errorThrown) { console.log(xmlHttpRequest.responseText); console.log(textStatus); console.log(errorThrown); } }); return mydata; } // call the function with your data latlondata = getlatlon(id); 

我们得到我们的回应。

 {"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]} 

编码使用

简单对象到JSON数组EncodeJsObjectArray()

 public class dummyObject { public string fake { get; set; } public int id { get; set; } public dummyObject() { fake = "dummy"; id = 5; } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('['); sb.Append(id); sb.Append(','); sb.Append(JSONEncoders.EncodeJsString(fake)); sb.Append(']'); return sb.ToString(); } } dummyObject[] dummys = new dummyObject[2]; dummys[0] = new dummyObject(); dummys[1] = new dummyObject(); dummys[0].fake = "mike"; dummys[0].id = 29; string result = JSONEncoders.EncodeJsObjectArray(dummys); 

结果:[[29,“mike”],[5,“dummy”]]

漂亮的用法

漂亮的打印JSON数组PrettyPrintJson()string扩展方法

 string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]"; string result = input.PrettyPrintJson(); 

结果是:

 [ 14, 4, [ 14, "data" ], [ [ 5, "10.186.122.15" ], [ 6, "10.186.122.16" ] ] ]