正确使用包含 JSON 内容的 StringBuilder

Correct use of StringBuilder with JSON content inside

我正在为这个案子苦苦挣扎。 我从 NetworkStream 接收 JSON 格式的数据,并将其放入 StringBuilder:

   buffer = new byte[client.ReceiveBufferSize];  
   bytesRead = s.Read(buffer, 0, client.ReceiveBufferSize);
   myCompleteMessage.AppendFormat("{0}", Encoding.UTF8.GetString(buffer, 0, bytesRead));

myCompleteMessage 内容下方(注意字符“~”):

"\"{\\"id\\": 0, \\"contour\\": [[[323, 377]], [[230, 479]], [[283, 436]]], \\"measureA\\": 18.694646183289144, \\"measureB\\": 197.76944936476116, \\"image\\": \\"iVBORw0KGgoAAAANSUhEUgAAAF4AAABnCAIAAAAGxWJcAAAgAElEQVR4AQHdcSKOAatVmwEBAQb+CQUFBQYGBgEBAQAF//7+/v3//vv7+/z2+gAAAP39/f39/QAC/wAAAAH/AAEBAf7+AAEBAQAAAAEBAQEDAP///wICAgAAAAIAAf7+/gEBAQAAAP4A/v7+/gMDAwAAAP0A/QAAAAAAAAAAAP0C/v///wAAAAEBAf8I//z8/P4F\\"}~\"\"{\\"id\\": 4, \\"contour\\": [[[570, 163]], [[585, 169]], [[606, 157]], [[599, 153]], [[581, 164]], [[577, 160]], [[586, 145]], [[608, 151]], [[614, 147]], [[583, 140]]], \\"measureA\\": 37.742413753208304, \\"measureB\\": 65.91583997176758, \\"image\\": \\"iVBORw0KGgoAAAANSUhEUgAAAC0AAAAeCAIAAAA3lgDOAAAP+0lEQVRIDQHwDw/wAW53bfr6+v7+/vv7+/r6+vv7+/v4/fz8/Pz//vv7+/z9AAAAAP39/cK4uwAAAAAAAAAAAAAAAAAAAC83NwUCAfz8/AQAAQEBAfr8/P////3//v7+/v/9/gEBAQD8/QAAAPv//v///wEDAv39/QD//v/////6/AAAAP7+/v7+/v4A/wICAgAAAQQYGBj39/f7+/v4+Pj9/f3+/v718vf29vb/AgH8/Pz6+/60qq0AAABMVlP//f3///8A/f/7+/v7/v/RyckAAAAAAAA8PT0AAAAEBgb9/f36/PsBAQEB/wD9/f3/AfwCAgIEAQD9/f39//4EBAT//v38/PwCBgL+/v7/////////AQAAAAD9/f4ECQwHBAcCAAAA/v7++vr69/f3Af//AwT/+vz+/f0DBQQBAAAAWWNgFhYWAgAB/Pz8/vv8+/v7/wIDUlpa+fn3+/v7xMPDAAAAAAAAAAAAOEBAAAAAAPv9AAAAA=\\"}"

现在,我将上面的字符串拆分为匹配字符“~”:

    var jsonList = myCompleteMessage.ToString().Split('~');

通过 foreach 循环,我在 myCompleteMessage 中获取 JSON 字符串元素,将其传递给 SimpleJSON 解析器并执行一些操作:

    foreach (string jsonRow in jsonList)
    {
       JSONNode data = JSONNode.Parse(jsonRow);
   
       do something
    }

但是解析器return异常告诉字符串不是JSON格式。

我哪里错了?


上面显示的 myCompleteMessage 的值与 Visual Studio 显示的值相同。当我 Debug.WriteLine(myCompleteMessage) 我看到:

没有可以点击的放大镜,然后我点击了 jsonlist 变量上的放大镜。下方内容:

"{\"id\": 0, \"contour\": [[[323, 377]], [[230, 479]], [[283, 436]]], \"measureA\": 18.694646183289144, \"measureB\": 197.76944936476116, \"image\": \"iVBORw0KGgoAAAANSUhEUgAAAF4AAABnCAIAAAAGxWJcAAAgAElEQVR4AQHdcSKOAatVmwEBAQb+CQUFBQYGBgEBAQAF//7+/v3//vv7+/z2+gAAAP39/f39/QAC/wAAAAH/AAEBAf7+AAEBAQAAAAEBAQEDAP///wICAgAAAAIAAf7+/gEBAQAAAP4A/v7+/gMDAwAAAP0A/QAAAAAAAAAAAP0C/v///wAAAAEBAf8I//z8/P4F/hUVFQI4BxYWFv8E+vj4+Pn77gEBAf8DBAcHBwYNCgYGBgUCBgAAAPsB+Pv7+/f49Pb29vsB9f7+/gAAAPz8/Pn+9P7+/gAAAAAAAP4B/AAAAAEBAf7+/gQBAgAAAAAAAAMDA/4ABAMDAwACAf///wD+AgAAAAAAAP////79AP7+/vv7/WBLeQAAAAAAAAAAAAAAAAT+/v4EBAQEBAQEBAQAAf4CAwP9/wH//wEB/wIB/wL///8AAAD+//8AAQH+/f////8CAQECAgEAAP8BAQEAAAD///8BAAEAAAD+/v4BAQEAAQEAAAAAAgH///8A/wABAQEAAAD/////AP8BAQECAgL///////////////8BAQH//P4DAQID/gP17vX75fQF/AQEEAD////+AwACAgEFBQgEBAYDAAQEAQX/AQAAAAD+/v35+fj8/Pj+/vr+A/3/Af/+/v7+AP0AAP7///0AAAACAgIAAP4AAAD+/v8BAQEAAAD///8BAQP//wH/AP/+/v4B/wEBAQH+//8BAQH//////////wL8/P5gS3mWq38E/QsKCgoMCxBQQ1wEAgICAAAA/v7+AQEBAwMCBAQE///+/////f39+/v7AgIC/f39////AAAAAAAAAAAAAQEBAAAAAwMD////////AgICAAD/AAAAAAAA////AAEA/////v39AAAAAQEAAAAA"}

JSON 格式不正确

using Newtonsoft.Json.Linq;

namespace ConsoleApp22
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string json = "\"{\\"id\\": 0, \\"contour\\": [[[323, 377]], [[230, 479]], [[283, 436]]], \\"measureA\\": 18.694646183289144, \\"measureB\\": 197.76944936476116, \\"image\\": \\"iVBORw0KGgoAAAANSUhEUgAAAF4AAABnCAIAAAAGxWJcAAAgAElEQVR4AQHdcSKOAatVmwEBAQb+CQUFBQYGBgEBAQAF//7+/v3//vv7+/z2+gAAAP39/f39/QAC/wAAAAH/AAEBAf7+AAEBAQAAAAEBAQEDAP///wICAgAAAAIAAf7+/gEBAQAAAP4A/v7+/gMDAwAAAP0A/QAAAAAAAAAAAP0C/v///wAAAAEBAf8I//z8/P4F\\"}~\"\"{\\"id\\": 4, \\"contour\\": [[[570, 163]], [[585, 169]], [[606, 157]], [[599, 153]], [[581, 164]], [[577, 160]], [[586, 145]], [[608, 151]], [[614, 147]], [[583, 140]]], \\"measureA\\": 37.742413753208304, \\"measureB\\": 65.91583997176758, \\"image\\": \\"iVBORw0KGgoAAAANSUhEUgAAAC0AAAAeCAIAAAA3lgDOAAAP+0lEQVRIDQHwDw/wAW53bfr6+v7+/vv7+/r6+vv7+/v4/fz8/Pz//vv7+/z9AAAAAP39/cK4uwAAAAAAAAAAAAAAAAAAAC83NwUCAfz8/AQAAQEBAfr8/P////3//v7+/v/9/gEBAQD8/QAAAPv//v///wEDAv39/QD//v/////6/AAAAP7+/v7+/v4A/wICAgAAAQQYGBj39/f7+/v4+Pj9/f3+/v718vf29vb/AgH8/Pz6+/60qq0AAABMVlP//f3///8A/f/7+/v7/v/RyckAAAAAAAA8PT0AAAAEBgb9/f36/PsBAQEB/wD9/f3/AfwCAgIEAQD9/f39//4EBAT//v38/PwCBgL+/v7/////////AQAAAAD9/f4ECQwHBAcCAAAA/v7++vr69/f3Af//AwT/+vz+/f0DBQQBAAAAWWNgFhYWAgAB/Pz8/vv8+/v7/wIDUlpa+fn3+/v7xMPDAAAAAAAAAAAAOEBAAAAAAPv9AAAAA=\\"}";

                JObject test = JObject.Parse(json);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

输出:

从 JsonReader 读取 JObject 时出错。当前 JsonReader 项目不是对象:字符串。路径 '',第 1 行,位置 400.


试试这个代码

        try
        {
            string json = myCompleteMessage;

            dynamic data = JObject.Parse(json);
            Console.WriteLine(data.id);
            Console.WriteLine(data.contour);
            Console.WriteLine(data.measureA);
            Console.WriteLine(data.measureB);
            Console.WriteLine(data.image);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }