Я знаю, что, вероятно, делаю что-то глупое, но я этого не вижу. Я пытаюсь десериализовать этот JSON:
{
"SendFields":
{
"Category":
{
"value": "Request Something"
},
"email":
{
"value": "[email protected]"
}
}
}
С этой структурой классов:
public class SendFields
{
[JsonProperty("Category")]
public KeyValuePair<string, string> Category { get; set; }
[JsonProperty("email")]
public KeyValuePair<string, string> email { get; set; }
}
public class MyData
{
[JsonProperty("SendFields")]
public KeyValuePair<string,SendFields> SendFields { get; set; }
}
Но я продолжаю получать нули в своем KVP SendFields:
Я не знаю, что делаю не так, но, возможно, кто-нибудь здесь укажет мне на мою очевидную слепоту. :)
Если вы сейчас настроили десериализацию из json, вам нужно будет настроить json аналогично этому: каждое свойство KVP представляет собой строку/строку, поэтому вам нужен ключ и значение для каждого свойства kvp.
{
"SendFields": {
"Category": {
"key": "category1",
"value": "Request Something"
},
"email": {
"key": "email1",
"value": "[email protected]"
}
}
}
К сожалению, я получаю этот JSON из другого приложения, а не из моего. Поэтому я пытаюсь привести структуру своего класса в соответствие с тем, что они отправляют.
если вы не можете изменить структуру json. воспользуйтесь этим сайтом json2csharp.com и вставьте туда свои данные json, и он сгенерирует для вас структуру данных C#. Основная проблема заключается в том, что тип данных KVP не будет работать для предоставленных данных json, но, используя этот сайт, вы увидите, что можете создать категорию и класс электронной почты со свойствами значения, которые будут соответствовать вашим данным json.
Использование сайта json2csharp.com сработало просто великолепно! Спасибо за помощь!
Соответствующая структура может выглядеть так:
public class MyData
{
public SendFields SendFields { get; set; }
}
public class SendFields
{
public ValueHolder Category { get; set; }
public ValueHolder email { get; set; }
}
public class ValueHolder
{
public string value { get; set; }
}
Примечания:
Существует соглашение о сопоставлении Dictionary<,>
с объектом JSON (поддерживается как System.Text.Json, так и Json.NET от Newtonsoft), которое используется для «динамических» имен свойств (например, вы можете заменить SendFields
на Dictionary<string, ValueHolder>
), но не для KeyValuePair<,>
, AFAIK .
Я бы рекомендовал называть свойства, используя стандартные соглашения (т. е. регистр Паскаля) и отмечать их соответствующими атрибутами (для Json.NET от Newtonsoft — JsonProperty
и для System.Text.Json — JsonPropertyName
).
С оригинальным SendFields
следующее будет работать для Json.NET от Newtonsoft), но не для System.Text.Json с настройками по умолчанию:
public class MyData
{
[JsonProperty("SendFields")]
public SendFields SendFields { get; set; }
}
Хотя я бы все же рекомендовал не использовать здесь KeyValuePair<,>
, поскольку он неправильно представляет вашу структуру JSON.
Рассмотрите возможность использования онлайн-инструментов, таких как https://quicktype.io/csharp или https://json2csharp.com/, для создания моделей для вашего JSON.
public class MyData { public SendFields SendFields { get; set; } }