首页 > 解决方案 > 正确使用带有 JSON 内容的 StringBuilder

问题描述

我正在为这个案子而苦苦挣扎。我从 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
    }

但是解析器返回一个异常,告诉字符串不是 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"}

标签: c#jsonstringbuilder

解决方案


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。


推荐阅读