Tôi vừa sử dụng XmlWriter để tạo một số XML để gửi lại trong phản hồi HTTP. Làm thế nào bạn sẽ tạo một chuỗi JSON. Tôi giả sử bạn sẽ chỉ sử dụng một trình tạo chuỗi để xây dựng chuỗi JSON và chúng định dạng phản hồi của bạn dưới dạng JSON?
Tôi vừa sử dụng XmlWriter để tạo một số XML để gửi lại trong phản hồi HTTP. Làm thế nào bạn sẽ tạo một chuỗi JSON. Tôi giả sử bạn sẽ chỉ sử dụng một trình tạo chuỗi để xây dựng chuỗi JSON và chúng định dạng phản hồi của bạn dưới dạng JSON?
Câu trả lời:
Bạn có thể sử dụng lớp JavaScriptSerializer , kiểm tra bài viết này để xây dựng một phương thức mở rộng hữu ích.
Mã từ bài viết:
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);
}
}
}
Sử dụng:
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();
Sử dụng Newtonsoft.Json làm cho nó thực sự dễ dàng hơn:
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);
Tài liệu: Tuần tự hóa và giải tuần tự JSON
string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });
.
"PropertyA"
Được PropertyA
?
string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });
không có dấu ngoặc kép trênPropertyA.
Thư viện này rất tốt cho JSON từ C #
Sử dụng Simlpe của Newtonsoft.Json và Newtonsoft.Json.Linq thư viện.
//Create my object
var my_jsondata = new
{
Host = @"sftp.myhost.gr",
UserName = "my_username",
Password = "my_password",
SourceDir = "/export/zip/mypath/",
FileName = "my_file.zip"
};
//Tranform it to Json object
string json_data = JsonConvert.SerializeObject(my_jsondata);
//Print the Json object
Console.WriteLine(json_data);
//Parse the json object
JObject json_object = JObject.Parse(json_data);
//Print the parsed Json object
Console.WriteLine((string)json_object["Host"]);
Console.WriteLine((string)json_object["UserName"]);
Console.WriteLine((string)json_object["Password"]);
Console.WriteLine((string)json_object["SourceDir"]);
Console.WriteLine((string)json_object["FileName"]);
Đoạn mã này sử dụng DataContractJsonSerializer từ System.R nb.Serialization.Json trong .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());
}
}
Hãy xem http://www.codeplex.com/json/ cho dự án json-net.aspx. Tại sao lại phát minh ra bánh xe?
Bạn cũng có thể dùng thử ServiceStack JsonSerializer, đây là trình tuần tự hóa .NET JSON nhanh nhất vào lúc này. Nó hỗ trợ tuần tự hóa DataContuces, mọi loại POCO, Giao diện, các đối tượng bị ràng buộc muộn bao gồm các loại ẩn danh, v.v.
Ví dụ cơ bản
var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json);
Lưu ý: Chỉ sử dụng microsofts JavaScriptSerializer nếu hiệu suất không quan trọng đối với bạn vì tôi phải rời khỏi điểm chuẩn của mình vì tốc độ của nó chậm hơn tới 40x-100x so với các trình sắp xếp JSON khác.
Nếu bạn cần kết quả phức tạp (được nhúng), hãy tạo cấu trúc của riêng bạn:
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;
}
};
}
và sau đó bạn có thể có được chuỗi JSON bằng cách gọi
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);
Kết quả sẽ như thế này:
json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"
Hy vọng nó giúp!
Nếu bạn không thể hoặc không muốn sử dụng hai trình tuần tự hóa JSON tích hợp ( JavaScriptSerializer và DataContractJsonSerializer ), bạn có thể thử thư viện JsonExSerializer - Tôi sử dụng nó trong một số dự án và hoạt động khá tốt.
Nếu bạn đang cố gắng tạo một dịch vụ web để phân phát dữ liệu qua JSON đến một trang web, hãy xem xét sử dụng bộ công cụ ASP.NET Ajax:
http://www.asp.net/learn/ajax/tutorial-05-cs.aspx
Nó sẽ tự động chuyển đổi các đối tượng của bạn được cung cấp qua dịch vụ web thành json và tạo lớp proxy mà bạn có thể sử dụng để kết nối với nó.
Các DataContractJSONSerializer sẽ làm mọi thứ cho bạn với cùng dễ dàng như các XMLSerializer. Nó tầm thường để sử dụng điều này trong một ứng dụng web. Nếu bạn đang sử dụng WCF, bạn có thể chỉ định sử dụng nó với một thuộc tính. Họ DataContractSerializer cũng rất nhanh.
Tôi thấy rằng bạn không cần serializer. Nếu bạn trả về đối tượng dưới dạng Danh sách. Hãy để tôi sử dụng một ví dụ.
Trong asmx của chúng tôi, chúng tôi nhận được dữ liệu bằng cách sử dụng biến chúng tôi đã chuyển qua
// 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; }
}
Sau đó, sử dụng jquery, chúng tôi truy cập dịch vụ, chuyển qua biến đó.
// 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);
Và chúng tôi nhận được phản hồi của chúng tôi.
{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
Sử dụng mã hóa
Đối tượng đơn giản cho JSON Array 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);
Kết quả: [[29, "mike"], [5, "giả"]]
Cách sử dụng khá
Phương pháp mở rộng chuỗi JSON khá PrettyPrintJson ()
string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]";
string result = input.PrettyPrintJson();
Kết quả là:
[
14,
4,
[
14,
"data"
],
[
[
5,
"10.186.122.15"
],
[
6,
"10.186.122.16"
]
]
]