【问题标题】:Can't parse JSON output无法解析 JSON 输出
【发布时间】:2015-02-05 12:10:00
【问题描述】:

我正在使用 Oauth2 从 Facebook 获取有关用户的信息。我得到的结果是 JSON 格式,但是当我尝试使用 JSON.NET 解析它时,我收到一条错误消息:异常:System.ArgumentException:不完整的 JSON 输入。在第 1 行,第 0 列。

示例代码:

request.GetResponseAsync().ContinueWith(t =>{
if(!t.IsFaulted && !t.IsCanceled){
    try{
        Console.WriteLine(t.Result.GetResponseText());

        dynamic obj = JsonObject.Parse(t.Result.GetResponseText());
        Console.WriteLine(obj.first_name);

    } catch (Exception e) {
        Console.WriteLine("Exception : "+ e);
    }
  }
});

t.Result.GetResponseText() 方法以这种格式返回一个字符串:

{
"id":"some_id",
"bio":"some_bio",
"first_name":"some_name",
"gender":"male",
"last_name":"some_name",
"link":"https:\/\/www.facebook.com\/app_scoped_user_id\/some_user_id\/",
"locale":"nb_NO",
"middle_name":"some_name",
"name":"some_name",
"timezone":1,
"updated_time":"2014-09-18T12:48:34+0000",
"verified":true
}

有人能指出我在这里缺少什么吗?提前致谢!

【问题讨论】:

  • 您是否进行了调试,这就是您所得到的? JSON 似乎是有效的......
  • 这是错误信息。我也认为 JSON 似乎是有效的。所以我不明白。异常:System.ArgumentException:不完整的 JSON 输入。在 ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.6.0.51/src/mono/mcs/class 中 System.Runtime.Serialization.Json.JavaScriptReader.ReadCore () [0x00225] 的第 1 行第 0 列/System.ServiceModel.Web/System.Runtime.Serialization.Json/

标签: c# json xamarin


【解决方案1】:

创建一个可以反序列化给定json数据的类

public class Rootobject
        {
            public string id { get; set; }
            public string bio { get; set; }
            public string first_name { get; set; }
            public string gender { get; set; }
            public string last_name { get; set; }
            public string link { get; set; }
            public string locale { get; set; }
            public string middle_name { get; set; }
            public string name { get; set; }
            public int timezone { get; set; }
            public DateTime updated_time { get; set; }
            public bool verified { get; set; }
        }

然后使用 JSON.NET 反序列化 json 数据

var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(t.Result.GetResponseText());

为我工作
希望这会有所帮助

【讨论】:

  • 我不再收到 JSON 错误消息,但如果我尝试从数据对象(如 Console.WriteLine(data.id))输出任何内容,我会收到 NullReferenceException。你明白了吗?
  • 编辑:奇怪。如果我将 JSON 字符串复制到字符串变量中,然后在反序列化方法中使用它,则数据对象不为空。如果我使用 t.Result.GetResponseText() 数据对象为空。
【解决方案2】:

错误信息表明响应文本是一个空字符串(不完整的 JSON 输入,第一行,第一个字符)。

只是预感:如果将响应文本存储在临时变量中,问题会自行解决吗?

var responseText = t.Result.GetResponseText();
Console.WriteLine(responseText);
dynamic obj = JsonObject.Parse(responseText);

这样做的原因是t.Result.GetResponseText() 仅在您第一次调用它时返回一个值。底层流不支持查找,JSON阅读器内部不缓存值。

【讨论】:

  • 不,它没有,但是如果我将 JSON 字符串复制到字符串变量中,然后在反序列化方法中使用它,则数据对象不为空。如果我使用 t.Result.GetResponseText() 数据对象为空。如果我将响应文本存储在临时变量中,则数据对象也为空。
  • 很明显t.Result.GetResponseText() 的返回值与您手动粘贴的字符串不同。
  • 是的,但我又觉得奇怪的是,当我输出 t.Result.GetResponseText() 时,我得到了我在原始帖子中写的确切 JSON 字符串。
  • 我的第一个想法是GetResponseText() 只会在你第一次调用它时返回一个值。
  • 您的想法是正确的,它只会在您第一次调用它时返回一个值。谢谢!
【解决方案3】:

感谢 Steven Liekens,我们发现 t.Result.GetResponseText() 方法只在第一次调用时返回一些东西。第二次返回一个空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多