【问题标题】:Unable to deserialize JSON into Object using C#无法使用 C# 将 JSON 反序列化为对象
【发布时间】:2020-03-18 19:57:47
【问题描述】:

我整个上午都在处理这个问题,我无法弄清楚我在这里做错了什么。

这是我正在使用的 XML。

{
    "item1": "{\"id\":\"53553621-da48-47dd-bad6-6e9d2b3c785f\",\"auth_token\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJDT0VMS0VSQFBPVU5EU0xBQlMuQ09NIiwianRpIjoiZjBlMjI3OTYtMTY4NC00MmRlLWE0ZDYtZDhiYmVlZmRmNmQ2IiwiaWF0IjoxNTg0NTU4ODg5LCJyb2wiOiJhcGlfYWNjZXNzIiwiaWQiOiI1MzU1MzYyMS1kYTQ4LTQ3ZGQtYmFkNi02ZTlkMmIzYzc4NWYiLCJuYmYiOjE1ODQ1NTg4ODgsImV4cCI6MTU4NDU2NjA4OCwiaXNzIjoid2ViQXBpIiwiYXVkIjoiYXBpLm1pbGxtYW5tdWx0aW1lZGlhLmNvbTo0MDQwIn0.dthKzyJRqtkanYNRWEkiqYf4yzQT_A9Qn-GkH5eNAwM\",\"expires_in\":7200}",
    "item2": "105"
}

item1 是一个标准的身份验证令牌,我需要提取并传递才能进行 API 调用,我主要需要那个 auth_token。 item2 是要返回的自定义字段。 由于某种原因,每当我尝试将此 JSON 反序列化为我的对象时,它都会出错。

public class AuthToken
{
    public string id { get; set; }
    public string auth_token { get; set; }
    public int expires_in { get; set; }
}

public class Token
{
    public AuthToken item1 { get; set; }
    public string item2 { get; set; }
}

这是我要反序列化的代码

var t = JsonConvert.DeserializeObject<Token>(token,
                        new JsonSerializerSettings
                        {
                            NullValueHandling = NullValueHandling.Ignore
                        });

我收到错误

Newtonsoft.Json.JsonSerializationException: 'Error converting value
ArgumentException: Could not cast or convert from System.String to MyAppName.AuthToken.

关于我在这里做错了什么有什么想法吗?

【问题讨论】:

  • 你能试试这个吗? JSON.NET:stackoverflow.com/questions/17584701/…
  • 我会很挑剔。 “从通常存储的数据构造对象”的操作称为反序列化,序列化正好相反。
  • 您的项目是转义字符串,因此反序列化器会认为它只是一个字符串值。

标签: c# json json.net


【解决方案1】:

问题是AuthToken 不是字符串。

您的令牌存储为字符串文字数据。

编辑源代码制作authtoken字符串(然后转换成AuthToken),或者让序列化器序列化AuthToken数据结构。

public class AuthToken
{
    public string id { get; set; }
    public string auth_token { get; set; }
    public int expires_in { get; set; }
}

public class Token
{
    public string item1{get; set;}
    private AuthToken _token;

    public AuthToken AuthToken{ get { return _token ?? _token= new AuthToken(item1);}}
    public string item2 { get; set; }
}

您必须创建 AuthToken ctor。

或者你也可以创建一个JsonConverter 来制作你想要的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2021-04-27
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多