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) {
    }
}

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

4

4 回答 4

7

我发现了问题所在。JSon.NET 将我的整数从 JSON 反序列化为 Int64 而不是 Int32,所以我没有输入 int,而是放了 long 并且一切都按原样工作。

有没有办法指定我希望这些属性反序列化为 int?

于 2010-05-12T09:33:09.177 回答
4

到这个时候,您可能已经解决了这些问题,但如果有人偶然发现这可能会有所帮助。

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

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

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

如果你想返回一个自定义的反序列化对象,你可以编写自己的转换器,Json.net 将使用这个自定义转换器转换/转换反序列化的对象。

桑杰·扎尔克

于 2011-03-01T17:52:40.820 回答
1

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

于 2012-03-20T18:03:48.417 回答
1

我对 T 列表也没有运气,没有错误,但只有空结果:

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“空设置”内容-.-)

于 2017-03-16T17:45:04.843 回答