C#如何仅移除JSON文本首尾引号而非全部引号?
我懂你的困扰——拿到的JSON字符串被首尾的双引号裹得严严实实,想去掉这对引号却不想动内部的引号,结果用全局替换把所有引号都删了,完全不是预期的效果对吧?
先明确你的问题:你拿到的原始字符串是带首尾引号和内部转义符的格式:
""{"serverToken": "798358975235895283958208564208520o45", "username": "ImSkrt", "imageUrl": "https://s3.amazonaws.com/media.orderv.com/orderv_live/static/player_avatars/12039273888.1557487912.907537.jpg", "message": "Success!"}""
你需要的是去掉首尾的引号,保留内部所有正常的引号和JSON结构。
正确的解决方案
你不需要全局替换引号,只需要针对首尾的那一对引号操作,这里有两种简单可靠的方法:
方法1:使用Trim()方法
String.Trim(char)可以精准移除字符串首尾指定的字符,这里我们传入双引号'"',它只会删掉开头和结尾的引号,内部的内容完全不受影响:
// 先处理转义字符(你的代码里已经完成这一步) string ss = s.Replace(@"\", ""); // 只移除首尾的双引号 string sss = ss.Trim('"'); Console.WriteLine(sss);
方法2:使用Substring()截取
如果担心首尾可能出现多个引号(不过你的场景大概率是单个),可以直接截取中间部分,跳过第一个和最后一个字符:
string ss = s.Replace(@"\", ""); // 先判断字符串长度避免索引越界,再截取中间内容 string sss = ss.Length >= 2 ? ss.Substring(1, ss.Length - 2) : ss; Console.WriteLine(sss);
为什么你的原代码不行?
你之前用ss.Replace("\"", "")是全局替换所有双引号,自然会把JSON内部用来包裹键、值的引号也一并删掉,直接破坏了JSON的结构,这肯定不是你想要的结果。
修改后的完整代码片段
把你代码的最后几行替换成上面的方法即可,比如:
WebClient wc = new WebClient(); HttpClient hc = new HttpClient(); HttpClient hc2 = new HttpClient(); HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://f2aa611yne.execute-api.us-east-1.amazonaws.com/production/players/confirm/"); List<KeyValuePair<string, string>> p = new List<KeyValuePair<string, string>>(); p.Add(new KeyValuePair<string, string>("device_id", "0AF0406E-6DD1-452E-BE14-3B5A94ACE320")); p.Add(new KeyValuePair<string, string>("passcode", textBox8.Text)); p.Add(new KeyValuePair<string, string>("phone_number", textBox4.Text)); HttpResponseMessage response = await hc.PostAsync("https://f2aa611yne.execute-api.us-east-1.amazonaws.com/production/players/confirm/", new FormUrlEncodedContent(p)); string s = await(response.Content.ReadAsStringAsync()); Console.WriteLine(s); string ss = s.Replace(@"\", ""); Console.WriteLine(ss); // 替换为Trim方法移除首尾引号 string sss = ss.Trim('"'); Console.WriteLine(sss);
这样就能得到你想要的干净JSON结构啦!
内容的提问来源于stack exchange,提问作者ThatNinjaThatDoesStuff

