我正在構建一個服務以將 HTML、一對字串和 JSON 資料回傳到回傳給瀏覽器的 JSON 結構中。
JSON 資料是通用的,直接從 SQL Server 生成。它可以有任意數量的欄位,所以我沒有任何型別的物件要提前序列化。
這是我的代碼(盡可能小)
[DataContract]
internal class message {
[DataMember]
public string html;
[DataMember]
public string status;
[DataMember]
public string title;
[DataMember]
public string data;
}
public static string Serialize(TType instance) {
var serializer = new DataContractJsonSerializer(typeof(TType));
using (var stream = new MemoryStream()) {
serializer.WriteObject(stream, instance);
return Encoding.UTF8.GetString(stream.ToArray());
}
}
message msg = new message();
msg.html = "<h1>Hello</h1><p>World</p>";
msg.title = "Test";
msg.status = "Success";
msg.data = "{['id':1,'name':'William']['id':2,'name':'Dylan']}'"; // NOTE JSON constructed elsewhere
string json = JSONSerializer<message>.Serialize(msg);
這會將資料輸出為字串,例如
{
"data": "{['id':1,'name':'William'],['id':2,'name':'Dylan']}'",
"html": "<h1>Hello<\/h1><p>World<\/p>",
"status": "Success",
"title": "Test"
}
但是,我希望將“資料”添加到我提供的物件陣列中。
{
"data": {
['id': 1, 'name': 'William'],['id': 2, 'name': 'Dylan']
},
"html": "<h1>Hello<\/h1><p>World<\/p>",
"status": "Success",
"title": "Test"
}
我正在考慮的一些選項
- 只是 JSON.Parse 瀏覽器中的資料字串(但我不想加倍記憶體,資料可能有數千行)
- 手動構建 JSON(但我擔心創建格式錯誤的 JSON)
理想情況下,我想找到一種“官方”的方式來避免格式??錯誤的 JSON 的風險。
-- 更新 按照 Sangeeth 的建議使用“動態”物件。這是一個更新的示例,雖然它確實回傳 2 個物件,但它們是空的。
// NOTE JSON now valid.
string strJSON = "[ { \"id\": 1, \"name\": \"William\" }, { \"id\": 2, \"name\": \"Dylan\" } ] ";
// NOTE: data shows 2 empty objects here.
dynamic data = JSONSerializer<dynamic>.DeSerialize(strJSON);
message msg = new message();
msg.html = "<h1>Hello</h1><p>World</p>";
msg.title = "Test";
msg.status = "Success";
msg.data = data;
string json = JSONSerializer<message>.Serialize(msg);
Console.Write(json);
輸出兩個空物件。
{"data":[{},{}],"html":"<h1>Hello<\/h1><p>World<\/p>","status":"Success","title":"Test"}
uj5u.com熱心網友回復:
如果我明白你的意思,你沒有一個 concreate 類來序列化或反序列化你的資料,因為它是動態的。
dynamic那么我可以建議的是使用 C# 對 ' ' 型別的內置支持。一旦您將 JSON 字串轉換為動態,它就成為動態的一個實體,并將被視為一個物件。您可以將此物件傳遞給瀏覽器
- 想象一下,您
plan string從資料庫中獲取資料 - 將其反序列化為“
dynamic”物件。動態物件可以具有任何結構和資料型別 - 將其反序列化為動態變數后,您可以將實體附加到服務器回應并發送到客戶端。當它到達客戶端時,它將是一個物件形式
這是一個例子
A. 反序列化為動態
dynamic results = JsonConvert.DeserializeObject<dynamic>(YOUR_JSON);
B. 在您的回應類/合同中再添加一項
[DataContract]
internal class message {
[DataMember]
public dynamic data;
}
C.回傳給客戶
message msg = new message();
msg.data = results;
評論后更新
試試這個
using Newtonsoft.Json;
public class Program
{
public static void Main(string[] args)
{
// NOTE JSON now valid.
string strJSON = "[ { \"id\": 1, \"name\": \"William\" }, { \"id\": 2, \"name\": \"Dylan\" } ] ";
dynamic results = JsonConvert.DeserializeObject<dynamic>(strJSON);
var msg = new Message();
msg.Html = "<h1>Hello</h1><p>World</p>";
msg.Title = "Test";
msg.Status = "Success";
msg.Data = results;
string output = JsonConvert.SerializeObject(msg);
Console.WriteLine(output);
Console.ReadLine();
}
public class Message
{
public string Html { get; set; }
public string Title { get; set; }
public string Status { get; set; }
public dynamic Data { get; set; }
}
}
輸出

uj5u.com熱心網友回復:
但我不想加倍記憶體,資料可能有數千行
任何型別的重新序列化都會創建一個新的字串物件。事實上,要正確地將您的子 JSON 提供給主 JSON,首先您需要對其進行反序列化,因此它實際上接近三倍。
因此,您需要做的是克服手動創建格式錯誤的 JSON 的恐懼,并正確地流式傳輸您的片段:
[HttpGet]
public async Task Get()
{
Response.ContentType = "application/json";
StreamWriter sw;
await using ((sw = new StreamWriter(Response.Body)).ConfigureAwait(false))
{
// compose your JSON here using sw.WriteLineAsync
await sw.FlushAsync().ConfigureAwait(false);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412317.html
標籤:
