Десериализовать JSON с пустым строковым ключом - PullRequest
0 голосов
/ 30 июня 2018

Ниже приведен класс контракта данных и атрибуты.

public partial class ValidationErrors
{

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string Message;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public ModelState ModelState;
}

[System.Runtime.Serialization.DataContractAttribute()]
public partial class ModelState
{   
    [System.Runtime.Serialization.DataMemberAttribute()]
    public string[] empty;
}     

Это код JSON, в котором я получаю проблему, и он находится после "ModelState", где имя поля не указано.

Как мне создать классы данных данных для отражения JSON ниже?

 {"Message":"The request is invalid.","ModelState":{"":["Some messege is being displayed"]}}

РЕДАКТИРОВАТЬ Код для десериализации процесса:

Stream res= await response.Content.ReadAsStreamAsync();
var x = await response.Content.ReadAsStringAsync();
object result= ModelStateSerializer.ReadObject(res);

1 Ответ

0 голосов
/ 30 июня 2018

Используя следующую структуру класса

public partial class ValidationErrors {
    public string Message { get; set; }
    public ModelState ModelState { get; set; }
}

public partial class ModelState : Dictionary<string, List<string>> {

}

В следующем примере показано, как использовать Json.Net для генерации желаемого JSON, описанного в исходном вопросе.

public static void Main()
{
    var errors = new ValidationErrors {
        Message = "The request is invalid.",
        ModelState = new ModelState {
            { "", new List<string>(){"Some messege is being displayed"} }   
        }
    };

    var json = JsonConvert.SerializeObject(errors);

    Console.WriteLine(json);
}

Выход:

{"Message":"The request is invalid.","ModelState":{"":["Some messege is being displayed"]}}

Выходной JSON можно десериализовать в ту же структуру классов, которая использовалась при сериализации.

Следующий пример читает содержимое ответа и преобразует его в нужный тип.

var json = await response.Content.ReadAsStringAsync();
var errors = JsonConvert.DeserializeObject<ValidationErrors>(json);
var message = errors.Message;
var modelState = errors.ModelState;
var details = modelState[""].FirstOrDefault();
...