ฉันเพิ่งใช้ XmlWriter เพื่อสร้าง XML เพื่อส่งกลับในการตอบสนอง HTTP คุณจะสร้างสตริง JSON อย่างไร ฉันคิดว่าคุณเพียงแค่ใช้ stringbuilder เพื่อสร้างสตริง JSON และพวกเขาจัดรูปแบบการตอบสนองของคุณเป็น JSON?
ฉันเพิ่งใช้ XmlWriter เพื่อสร้าง XML เพื่อส่งกลับในการตอบสนอง HTTP คุณจะสร้างสตริง JSON อย่างไร ฉันคิดว่าคุณเพียงแค่ใช้ stringbuilder เพื่อสร้างสตริง JSON และพวกเขาจัดรูปแบบการตอบสนองของคุณเป็น JSON?
คำตอบ:
คุณสามารถใช้คลาส 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
string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });
.
"PropertyA"
จะเป็นPropertyA
อย่างไร
string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });
ไม่มีการเสนอราคาซ้ำPropertyA.
ห้องสมุดนี้ดีมากสำหรับ JSON จาก C #
ใช้ Simlpe ของNewtonsoft.JsonและNewtonsoft.Json.Linqห้องสมุด
//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"]);
ตัวอย่างรหัสนี้ใช้ DataContractJsonSerializer จาก System.Runtime.Serialization.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-net.aspx ทำไมต้องคิดค้นล้อใหม่
คุณสามารถลองใช้ ServiceStack JsonSerializerของฉันซึ่งเป็นserializer .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 serializers อื่น ๆ
หากคุณต้องการผลลัพธ์ที่ซับซ้อน (ฝัง) สร้างโครงสร้างของคุณเอง:
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 serializers ในตัวสองตัว ( JavaScriptSerializerและDataContractJsonSerializer ) คุณสามารถลองใช้ห้องสมุดJsonExSerializer - ฉันใช้มันในโครงการหลายโครงการและทำงานได้ค่อนข้างดี
หากคุณกำลังพยายามสร้างบริการเว็บเพื่อให้บริการข้อมูลผ่าน JSON ไปยังหน้าเว็บให้พิจารณาใช้ชุดเครื่องมือ ASP.NET Ajax:
http://www.asp.net/learn/ajax/tutorial-05-cs.aspx
มันจะแปลงวัตถุของคุณที่ให้บริการผ่านเว็บเซอร์เป็น json โดยอัตโนมัติและสร้างคลาสพร็อกซีที่คุณสามารถใช้เชื่อมต่อกับมัน
DataContractJsonSerializerจะทำทุกอย่างให้คุณแบบเดียวกับที่ง่ายอย่างที่ XMLSerializer มันเป็นเรื่องเล็กน้อยที่จะใช้สิ่งนี้ในเว็บแอป หากคุณใช้ WCF คุณสามารถระบุการใช้กับแอททริบิวต์ได้ ตระกูล DataContractSerializer นั้นเร็วมากเช่นกัน
ฉันพบว่าคุณไม่ต้องการ serializer เลย หากคุณส่งคืนวัตถุเป็นรายการ ขอผมใช้ตัวอย่าง
ใน 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 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);
ผลลัพธ์: [[29, "mike"], [5, "dummy"]]
การใช้งานสวย
พริ้นต์วิธี JSON Array 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"
]
]
]