如何合并 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。

-- 更新 按照 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 的一个实例,将被视为一个对象。您可以将此对象传递给您的浏览器

  1. 假设您从数据库
  2. 中获得了 plan string 的数据
  3. 将其反序列化为“dynamic”对象。动态对象可以有任何结构和数据类型
  4. 将其反序列化为动态变量后,您可以将该实例附加到服务器响应并发送给客户端。到达客户端时为对象形式

这是一个例子

一个。反序列化为动态

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; }
    }
}

输出