C# 由于原语无效,无法反序列化JSON字符串

C# 由于原语无效,无法反序列化JSON字符串,c#,json,https,json.net,httpwebresponse,C#,Json,Https,Json.net,Httpwebresponse,我在从HTTPS web响应反序列化JSON字符串时遇到问题。每当我尝试执行此操作时,它都会返回以下错误: 其他信息:无效的JSON原语:。 (包括期间) 现在,因为我知道服务器正在发送一个有效的JSON字符串(Fiddler这么说),我相信该字符串可能是通过HTTPS加密的,这会干扰我的反序列化。如何修复此错误并正确反序列化json字符串: 我尝试使用.NET框架和Newtsoft的JSON.NET,如下面的代码所示 StringBuilder login = new Str

我在从HTTPS web响应反序列化JSON字符串时遇到问题。每当我尝试执行此操作时,它都会返回以下错误:

其他信息:无效的JSON原语:。

(包括期间)

现在,因为我知道服务器正在发送一个有效的JSON字符串(Fiddler这么说),我相信该字符串可能是通过HTTPS加密的,这会干扰我的反序列化。如何修复此错误并正确反序列化json字符串:

我尝试使用.NET框架和Newtsoft的JSON.NET,如下面的代码所示

        StringBuilder login = new StringBuilder();
        login.Append("json=%7B%22username%22%3A%22csharpautomaton%22%2C%22password%22%3A%22[redacted password]%22%2C%22remember%22%3A0%7D");
        byte[] logBytes = encoding.GetBytes(login.ToString());

        HttpWebRequest requirejs = (HttpWebRequest)WebRequest.Create(new Uri("https://www.textnow.com/api/sessions"));

        //requirejs.PreAuthenticate = true;
        requirejs.KeepAlive = true;
        requirejs.Method = "POST";
        requirejs.Accept = "Accept: application/json, text/javascript, */*; q=0.01";
        requirejs.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
        requirejs.Headers.Add("Accept-Language", "en-US,en;q=0.8");
        requirejs.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
        requirejs.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";

        Stream sw = requirejs.GetRequestStream();
        sw.Write(logBytes, 0, logBytes.Length);
        sw.Close();
        response = (HttpWebResponse)requirejs.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader sr = new StreamReader(stream,true);

        string line = sr.ReadLine();
        //the one I tried second
        TheObject id = JsonConvert.DeserializeObject<TheObject>(line);
        MessageBox.Show(id.ToString());

        //the one I tried first v
        System.Web.Script.Serialization.JavaScriptSerializer deserialize = new System.Web.Script.Serialization.JavaScriptSerializer();
        TheObject jsonObject = deserialize.Deserialize<TheObject>(sr.ReadToEnd());

//the object I used with just .NET
public class TheObject
{
    string id { get; set; } 
    string username { get; set; }
}
//the object I used with JSON.NET
public class TheObject
{
    [JsonProperty("id")]
    public string id { get; set; }

    [JsonProperty("username")]
    public string username { get; set; }
}
StringBuilder登录=新建StringBuilder();
login.Append(“json=%7B%22username%22%3A%22cSharpAutomation%22%2C%22password%22%3A%22[修订密码]%22%2C%22membered%22%3A0%7D”);
byte[]logBytes=encoding.GetBytes(login.ToString());
HttpWebRequest requirejs=(HttpWebRequest)WebRequest.Create(新Uri(“https://www.textnow.com/api/sessions"));
//requirejs.PreAuthenticate=true;
requirejs.KeepAlive=true;
requirejs.Method=“POST”;
requirejs.Accept=“Accept:application/json,text/javascript,*/*;q=0.01”;
Add(“接受编码”、“gzip、deflate、sdch”);
requirejs.Headers.Add(“接受语言”,“en-US,en;q=0.8”);
requirejs.UserAgent=“Mozilla/5.0(Windows;U;Windows NT 6.1;en-US;rv:1.9.2.13)Gecko/20101203 Firefox/3.6.13”;
requirejs.ContentType=“application/x-www-form-urlencoded;charset=UTF-8”;
Stream sw=requirejs.GetRequestStream();
sw.Write(logBytes,0,logBytes.Length);
sw.Close();
response=(HttpWebResponse)requirejs.GetResponse();
Stream=response.GetResponseStream();
StreamReader sr=新StreamReader(stream,true);
字符串行=sr.ReadLine();
//我第二次试的那个
对象id=JsonConvert.DeserializeObject(行);
Show(id.ToString());
//我第一次试的那个v
System.Web.Script.Serialization.JavaScriptSerializer反序列化=新建System.Web.Script.Serialization.JavaScriptSerializer();
TheObject jsonObject=反序列化。反序列化(sr.ReadToEnd());
//我与.NET一起使用的对象
公共类对象
{
字符串id{get;set;}
字符串用户名{get;set;}
}
//我在JSON.NET中使用的对象
公共类对象
{
[JsonProperty(“id”)]
公共字符串id{get;set;}
[JsonProperty(“用户名”)]
公共字符串用户名{get;set;}
}

结果表明,这也不起作用,但却是解决方案的一部分:

我们确定TextNow实际上需要将转义的JSON字符串传递给
JSON=
键,如下所示:

json={\"username\":\"csharpautomaton\",\"password\":\"[redacted password]\",\"remember\":0}
更多信息,尽管这不起作用:

TextNow要求将
username
参数和
password
参数作为
x-www-form-urlencoded
内容(表单-值对)传递

您不能像这样传递完整的url编码的JSON字符串,您需要将JSON字符串解码成一个可用的对象(您已经在使用
jsonObject
)然后传递这些参数

最后,您需要具备以下功能:

StringBuilder login = new StringBuilder();
login.Append("username=csharpautomation&password=xxxxx");
byte[] logBytes = encoding.GetBytes(login.ToString());

由于您已经在类中实现了jsonObject(虽然使用的是
id/username
而不是
username/password
?),因此在解码JSON对象后重建参数字符串应该不是什么大挑战。

事实证明,服务器正在发送压缩响应。因此,我最终需要做的就是删除
“接受编码”、“gzip、deflate、sdch”
,不过我也可以手动解压缩它,但这是一个更简单的选择。
@谢谢你的帮助,你真是太棒了,坦白地说,我对你花在帮助我身上的时间感到惊讶,我非常感谢

https不会干扰反序列化——如果请求成功,您将获得解密后的流。你有关于textnow API的文档吗?无身份验证调用将返回一个(无用的)错误。希望能够使用测试凭据尝试此操作。我还认为您没有尝试使用它?在第二次尝试中,您只解析一行(
ReadLine
)。您确定在一行中获得完整的json字符串吗?另外,
登录的内容是什么?它是有效的x-www-form-urlencoded内容吗?@user3038092我添加了登录代码,应该是有效的@我没有关于TextNow API的文档,我不相信他们甚至没有一个可供公众使用的文档。不,我没有尝试使用System.Web.Helpers.Json,你认为这会有助于解决我的问题吗?老实说,在这种情况下我不知道,但可能值得一试。NET从未很好地采用过JSON(因此采用了各种实现),最好都尝试一下。我会看一看,看看我能想出什么。因为他们的API上没有任何文档,我不能完全确定,但在我使用API的所有年中,我从未见过一个期望JSON负载作为urlencoded键值对的。可以是发布到服务器的原始JSON,也可以是键:值对。去抓取并
发布
用户名/密码密钥对。您将看到,如果您传递json=xxxxx,它将返回
参数\u缺失
,而如果传递username=&password=它将返回
签名\u无效
(超过此,我无法告诉您为什么它不高兴)。因此,我修复了登录字节。但我仍然得到无效的json原语?我得到了一个很好的回复,但是当我查看它时,我发现里面没有句点,这可能是什么问题呢?不管怎样,我找到了修复登录的方法,我现在将它发送为:“json={\“username\”:“csharpautomaton\”,“password\”:“[redacted password]\,“memory\”:0},这太疯狂了!与所有API最佳实践背道而驰。很好,你把它整理好了