JSon.NET的DeserializeObject<List<T>>无法返回列表,也没有报错。

7

我被Json.NET库和它的DeserializeObject方法困住了。文档并没有说明可能会发生什么,所以我希望有人能解释一下如何将JSON反序列化为用户对象列表。

我正在尝试反序列化这个JSON

[
    {"userid":"0",
     "listid":1,
     "lastname":"Mann",
     "inplace":true,
     "xpos":428,
     "ypos":111
    },
    {"userid":"1",
     "listid":1,
     "lastname":"Parker",
     "inplace":true,
     "xpos":334,
     "ypos":154
    },
    {"userid":"2",
     "listid":1,
     "lastname":"Terry",
     "inplace":true,
     "xpos":513,
     "ypos":160
    }
]

将其转换为用户对象
[JsonObject(MemberSerialization.OptIn)]
public class User
{
    [JsonProperty(PropertyName = "userid")]
    public string userid { get; set; }
    [JsonProperty(PropertyName = "listid")]
    public int listid { get; set; }
    [JsonProperty(PropertyName = "lastname")]
    public string lastname { get; set; }
    [JsonProperty(PropertyName = "inplace")]
    public bool inplace { get; set; }
    [JsonProperty(PropertyName = "xpos")]
    public int xpos { get; set; }
    [JsonProperty(PropertyName = "ypos")]
    public int ypos { get; set; }

    public User()
    {
    }
}

使用

List<User> users = JsonConvert.DeserializeObject<List<User>>(jsonUsers);

没有成功。 没有收到任何错误或用户。JsonConvert.DeserializeObject只是默默地停止工作。

我尝试创建模拟并使用该JSON字符串执行SerializeObject和DeserializeObject,但结果相同,没有错误,也没有结果。

我甚至尝试传递serializersettings以查看出了什么问题,但也没有错误。

JsonSerializerSettings settings = new JsonSerializerSettings();

settings.Error += delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args) {
                    errorList.Add(args.ErrorContext.Error.Message);
              };
List<User> users = JsonConvert.DeserializeObject<List<User>>(jsonUsers, settings);

当我尝试查看反序列化期间发生的情况时,我注意到上下文未初始化?!

public class User
{
    ...
    [OnDeserializing]
    internal void OnDeserializing(StreamingContext context) {
    }
}

我在这里做错了什么?我如何将其反序列化为用户列表?

感谢您展示您的工作。帮助了我解决JSON问题! :) - discorax
4个回答

8

我找到了问题所在。JSon.NET将我的整数从JSON反序列化为Int64而不是Int32,因此我将int改为long,一切都像应该的那样正常工作。

有没有办法指定要将属性反序列化为int?


Jan的回答提供了你所需要的,然后你可以使用int.Parse(StringValue)或者int.TryParse(StringValue)来获取整数值。 - WonderWorker

4

到这个时候,你可能已经解决了问题,但如果有人遇到这个问题,这可能会有所帮助。

我正在使用Json.net库来反序列化自定义的复杂分层对象。我有几个转换器可以将Json转换为C#对象。

您可以使用JsonConvertAttributes来强制转换属性的返回类型。

[JsonConverter(typeof(Int32))] 
public int xpos { get; set; }

如果您想返回自定义反序列化对象,您可以编写自己的转换器,Json.net将使用此自定义转换器对反序列化对象进行强制转换/转换。
Sanjay Zalke

1

我有相同的问题,因为我的类中没有默认构造函数(不带参数的构造函数)


1

我使用T列表也没有成功,没有错误但只有null结果:

List<SomeClass> obj = JsonConvert.DeserializeObject<List<SomeClass>>(jsonstring);

public class SomeClass  
{
     public string SomeProp {get;set;}
     (...)
}

对我来说,以下是解决方案。我只能猜测解释,所以我认为你最好只使用代码:

SomeClassList obj = JsonConvert.DeserializeObject<SomeClassList>(jsonstring);

public class SomeClass 
{
   public string SomeProp {get;set;}
   (...)
}

public class SomeClassList 
{
   public List<SomeClass> SomeClass {get;set;}
}

希望它有所帮助。 (如果没有,祝你好运在搜索时整理所有该死的 JSON “null 设置”问题。-.-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接