Десериализация json ключ-значение в словарь c# - PullRequest
0 голосов
/ 02 августа 2020

У меня в теле запроса есть следующее JSON:

{
    "tableName": "ApiTestTbl",
    "columnsValues": {
        "test1": "value1",
        "column2": "value2"
    }
}

И у меня есть эти 2 класса:

public class InsertIntoDbEntity 
{
    public string tableName { get; set; }
    public InsertIntoDbColumnsValuesEntity columnsValues { get; set; }
}

public class InsertIntoDbColumnsValuesEntity
{
    public Dictionary<string, string> columnsValues { get; set; }
}

И функция контроллера следующая:

[HttpPost]
[Route("app/singleinsert")]
public CrudReturnEntity InsertIntoDB(InsertIntoDbEntity entity)
{        
    return null;
}

Значение tableName хорошо присвоено «ApiTestTbl», но columnsValues ​​всегда имеет значение null. Я использую словарь, потому что количество пар ключ-значение в columnValues ​​не определено, поэтому я хочу сохранить их в словаре для обработки. Спасибо!

1 Ответ

0 голосов
/ 02 августа 2020

Как @ Kn oop предложил в комментариях, в вашем случае довольно просто иметь Словарь непосредственно как член вашей модели InsertIntoDbEntity.

Однако в тех случаях, когда у вас нет такой возможности и требуется строгая структура, следующий способ ее решения. Мы собираемся создать собственный Json конвертер для внутреннего свойства, используя Newtonsoft. Json.

Создание специального JSON конвертера для внутреннего свойства

public class MyInternalConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if(reader.TokenType == JsonToken.StartObject)
        {
            JObject item = JObject.Load(reader);

            // You may want to perform any sanity checks you want here

            Dictionary<string, string> blah = JsonConvert.DeserializeObject<Dictionary<string, string>>(item.ToString());

            return new InsertIntoDbColumnsValuesEntity
            {
                columnsValues = blah
            };
        }
        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...