如何合并 2 JSON 个字符串 C#
How to Merge 2 JSON strings C#
我正在为 return HTML 构建一个服务,一些字符串和 JSON 数据进入 JSON 结构 returned 到浏览器.
JSON 数据是通用的,直接从 SQL 服务器生成。它可以有任意数量的字段,所以我没有任何类型的对象可以提前序列化。
这是我的代码(尽可能小)
[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 的建议使用“动态”对象。这是一个更新的示例,虽然它有 return 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"}
but I don't want to double memory, the data could have thousands of rows
任何类型的 re-serializing 都会创建一个新字符串 object。事实上,要将你的 child JSON 正确地喂给主人,首先你需要 de-serialize 它,所以它实际上接近三倍。
因此,您需要做的是克服手工创建畸形 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);
}
}
如果我明白你的意思,你没有一个具体的 class 来序列化或反序列化你的数据,因为它是动态的。
那么我可以建议使用 C#'s built in support for 'dynamic
' 类型。一旦将 JSON 字符串转换为 dynamic,它就成为 dynamic 的一个实例,将被视为一个对象。您可以将此对象传递给您的浏览器
- 假设您从数据库
中获得了 plan string
的数据
- 将其反序列化为“
dynamic
”对象。动态对象可以有任何结构和数据类型
- 将其反序列化为动态变量后,您可以将该实例附加到服务器响应并发送给客户端。到达客户端时为对象形式
这是一个例子
一个。反序列化为动态
dynamic results = JsonConvert.DeserializeObject<dynamic>(YOUR_JSON);
乙。在您的回复中再添加一项 class/contract
[DataContract]
internal class message {
[DataMember]
public dynamic data;
}
C。 Return 给客户
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; }
}
}
输出
我正在为 return HTML 构建一个服务,一些字符串和 JSON 数据进入 JSON 结构 returned 到浏览器.
JSON 数据是通用的,直接从 SQL 服务器生成。它可以有任意数量的字段,所以我没有任何类型的对象可以提前序列化。
这是我的代码(尽可能小)
[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 的建议使用“动态”对象。这是一个更新的示例,虽然它有 return 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"}
but I don't want to double memory, the data could have thousands of rows
任何类型的 re-serializing 都会创建一个新字符串 object。事实上,要将你的 child JSON 正确地喂给主人,首先你需要 de-serialize 它,所以它实际上接近三倍。
因此,您需要做的是克服手工创建畸形 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);
}
}
如果我明白你的意思,你没有一个具体的 class 来序列化或反序列化你的数据,因为它是动态的。
那么我可以建议使用 C#'s built in support for 'dynamic
' 类型。一旦将 JSON 字符串转换为 dynamic,它就成为 dynamic 的一个实例,将被视为一个对象。您可以将此对象传递给您的浏览器
- 假设您从数据库 中获得了
- 将其反序列化为“
dynamic
”对象。动态对象可以有任何结构和数据类型 - 将其反序列化为动态变量后,您可以将该实例附加到服务器响应并发送给客户端。到达客户端时为对象形式
plan string
的数据
这是一个例子
一个。反序列化为动态
dynamic results = JsonConvert.DeserializeObject<dynamic>(YOUR_JSON);
乙。在您的回复中再添加一项 class/contract
[DataContract]
internal class message {
[DataMember]
public dynamic data;
}
C。 Return 给客户
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; }
}
}
输出