【问题标题】:Newtonsoft JSON DeserializeObject Deserialization of Serialized objectNewtonsoft JSON DeserializeObject 序列化对象的反序列化
【发布时间】:2016-05-02 20:15:26
【问题描述】:

我返回了以下 JSON 字符串,我正在尝试反序列化,但我在填充对象属性的值时遇到问题。

这是返回的 JSON 字符串:

"{\"ClientData\":[{\"clientID\":9999999,\"userID\":123,\"authID\":\"8a20627be9ec4c608f4c609a24e74174\"}]}"

现在,我通过以下方式指定了我的 ClientData 类:

public class ClientData
{
    [JsonProperty("clientID")]
    public long? ClientID { get; set; }

    [JsonProperty("userID")]
    public int? UserID { get; set; }

    [JsonProperty("authID")]
    public string AuthID { get; set; }
}

我在转换中做错了什么?我认为它就像指定一样简单:

var result = JsonConvert.DeserializeObject<ClientData>(auth);

但是,这不会产生任何结果。我认为问题可能在于 JSON 字符串的构造方式,即为对象定义的属性。

有人可以帮我指出正确的方向吗?

谢谢

【问题讨论】:

  • 在您的 JSON 中,ClientData 是一个数组(集合)而不是单个对象,但您正在反序列化,就好像它是一个对象一样。 “[]”是死赠品
  • 如果我使用 > 它会爆炸吗?我认为这可能也是如此,但使用 List 也不起作用。它声明“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[AerosExpress.Adjuster.Demo.DataClasses.ClientData]',因为该类型需要正确反序列化的 JSON 数组(例如 [1,2,3])。”
  • 创建一个具有 1 个属性的顶级类,该属性是一个列表 并序列化到该顶级类。
  • 如果您将课程更改为 public class SomeClass { public List ClientData {get;set;}}。并且做 ,你应该得到对象
  • @NathanRaley 到目前为止你提供的内容我会更改序列化

标签: c# json json.net deserialization json-deserialization


【解决方案1】:

您拥有的数据是一个包裹在另一个对象中的 JSON 数组。您需要创建一个辅助类,将您的 ClientData 作为一个列表放在该类中并反序列化它。

包含您的列表的基类

public class ClientDataInformation 
{
    [JsonProperty("ClientData")]
    public List<ClientData> ClientList {get;set;}
}

反序列化

var result = JsonConvert.DeserializeObject<ClientDataInformation>(auth);

【讨论】:

    【解决方案2】:

    这可能会解决问题

    private static clientFileName = "yourfile.dat";
    
    public static async Task<List<ClientData>> LoadClientDataFromJsonAsync()
        {
            string clientJsonString = await DeserializeClientDataAsync(clientFileName);
            if (clientJsonString != null)
                return (List<ClientData>)JsonConvert.DeserializeObject(clientJsonString, typeof(List<ClientData>));
            return null;
        }
    
    private static async Task<ClientData> DeserializeClientDataAsync(string fileName)
        {
            try
            {
                StorageFile localFile = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
                return await FileIO.ReadTextAsync(localFile);
            }
            catch (FileNotFoundException)
            {
                return null;
            }
    

    【讨论】:

    • 我希望它像重铸那样简单,但可惜它也抱怨那个。感谢 Kasper 的推荐。
    【解决方案3】:

    看起来您的客户端数据设置为数组。拆下支架,看看是否有效。此外,您将它包装在另一个类中。如果您需要前面的 ClientData,则需要某种类,例如:

    public class ClientDataObject
    {
        public ClientData ClientData { get; set; }
    }
    

    【讨论】:

    • 从我从其他建议中读到的内容,它需要是一个 ClientData 列表,而不仅仅是一个单例。除此之外,它的方向是正确的。
    • 啊,我认为既然现有代码中没有列表/数组,那么JSON一定是错误的。
    • 不,我尝试在 DeserializeObject 调用中将其转换为 List,但它也不喜欢这种格式并引发 JSON 反序列化错误。但是,您关于删除方括号的建议是有效的,因为这将删除集合并且不需要包装器来正确反序列化对象。
    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多