12 ответов:
вы могли бы использовать класс JavaScriptSerializer, Регистрация в этой статье чтобы построить полезный метод расширения.
код из статьи:
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
этот фрагмент кода использует DataContractJsonSerializer из системы.Во время выполнения.Сериализация.Json в .NET 3.5.
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-сети.проект aspx. Зачем заново изобретать колесо?
вы также можете попробовать мой ServiceStack JsonSerializer это самый быстрый сериализатор .NET JSON на данный момент. Он поддерживает сериализацию DataContracts, любой тип POCO, интерфейсы, объекты с поздней привязкой, включая анонимные типы и т. д.
Простой Пример
var customer = new Customer { Name="Joe Bloggs", Age=31 }; var json = JsonSerializer.SerializeToString(customer); var fromJson = JsonSerializer.DeserializeFromString<Customer>(json);Примечание: используйте только Microsofts JavaScriptSerializer, если производительность не важна для вас, поскольку мне пришлось оставить ее вне моих тестов с момента ее до 40x-100x медленнее чем другие сериализаторы JSON.
Если вам нужен сложный результат (встроенный) создайте свою собственную структуру:
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; } }; }и тогда вы можете получить строку JSON с вызовом
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\"}}"надеюсь, что это помогает!
Если вы не можете или не хотите использовать два встроенных сериализаторов JSON ( JavaScriptSerializer и DataContractJsonSerializer) можно попробовать JsonExSerializer библиотека - я использую его в ряде проектов и работает довольно хорошо.
Если вы пытаетесь создать веб-службу для передачи данных через JSON на веб-страницу, рассмотрите возможность использования ASP.NET Ajax toolkit:
http://www.asp.net/learn/ajax/tutorial-05-cs.aspx
он автоматически преобразует ваши объекты, обслуживаемые через веб-сервис, в json и создает прокси-класс, который вы можете использовать для подключения к нему.
The DataContractJSONSerializer будет делать все для вас с такой же просто, как XMLSerializer. Его тривиально использовать в веб-приложении. Если вы используете WCF, вы можете указать его использование с атрибутом. Семейство DataContractSerializer также работает очень быстро.
я обнаружил, что вам вообще не нужен сериализатор. Если вы возвращаете объект в виде списка. Позвольте мне привести пример.
В нашем asmx мы получаем данные, используя переменную, которую мы передали
// 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 мы получаем доступ к службе, передавая эту переменную.
// 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,"Майк"],[5,"манекен"]]
Довольно Использование
довольно распечатать в формате JSON массив PrettyPrintJson() строку метода расширения
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" ] ] ]
Comments