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

Я застрял с библиотекой 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, но с тем же результатом, без ошибок, без результатов.

Я даже пытаюсь передать настройки сериализатора, чтобы понять, что не так, но без ошибок.

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

Что я здесь делаю неправильно? И как я могу десериализовать это в список пользователей?


person user284258    schedule 11.05.2010    source источник
comment
Спасибо, что показали свою работу. Помог мне решить мою проблему json! :)   -  person discorax    schedule 07.06.2010
comment
Большое спасибо, это решило мою проблему. :D   -  person Roy    schedule 14.06.2012


Ответы (4)


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

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

person user284258    schedule 12.05.2010
comment
Ответ Яна дает именно то, что вам нужно, и оттуда вы можете использовать int.Parse(StringValue) или int.TryParse(StringValue) для получения значений int. - person WonderWorker; 25.09.2017

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

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

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

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

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

Санджай Залке

person Sanjay Zalke    schedule 01.03.2011

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

person Vova Bilyachat    schedule 20.03.2012

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

person Jan    schedule 16.03.2017