JSon.NET DeserializeObject> не возвращает список и не выдает ошибку

Я застрял с 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 просто умирает молча.

Я попытался создать макет и сделать SerializeObject и DeserializeObject с этой строкой JSON, но с тем же результатом, без ошибок, без результатов.

Я даже пытаюсь пройти 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 ответов


Я нашел, что было проблемой. JSon.NET десериализовал мои целые числа от JSON до Int64 вместо Int32, поэтому вместо int я поставил long, и все работало так, как должно было в первую очередь.

есть ли способ указать, что я хочу, что свойства десериализовать в int?


к этому времени вы могли бы решить проблемы, но если кто-нибудь наткнется на это, может помочь.

Я использую Json.net библиотека для де-сериализации пользовательских сложных иерархических объектов. У меня есть несколько преобразователей для преобразования объектов Json в C#.

вы можете использовать JsonConvertAttributes для приведения возвращаемых типов для свойств.

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

Если вы хотите вернуть пользовательский объект де-сериализации, вы можете написать свои собственные конвертеры и Json.net будет cast / convert де-сериализованный объект с помощью этого пользовательского преобразователя.

Zalke Санджай


У меня такая же проблема, потому что у меня нет конструктора по умолчанию (конструктор с пустыми параметрами) в моем классе


мне не повезло со списком 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" null setting " во время поиска -.-)