Как сопоставить JSON объектам C#
У меня проблемы с пониманием, как это сделать.
По сути, у нас есть API, пользователь отправляет JSON в формате: (извините, если код не идеален, но вы понимаете)
{"Profile": [{
"Name":"Joe",
"Last :"Doe",
"Client":
{
"ClientId":"1",
"Product":"Apple",
"Message":"Peter likes apples"
},
"Date":"2012-02-14",
}]}
Хорошо, я не уверен, правильно ли я отформатировал этот JSON, но теперь вот моя проблема.
У меня есть класс под названием Profile
с параметрами Name, Last и объектом в качестве одного из его членов, называемых Client, а также свойством Date.
Что-то вроде этого:
public class Profile
{
public string Name {get; set;}
public string Last {get; set;}
public Client client {get; set;}
public DateTime dDate {get; set;}
}
В общем, я не уверен, как захватить JSON и затем сопоставить его с моим объектом.
Любая помощь в "помощи", которую я понимаю, будет высоко ценится.
5 ответов
Вы можете использовать Json.NET для десериализации вашей строки json как (с некоторыми изменениями в ваших классах)
var yourObject = JsonConvert.DeserializeObject<Root>(jsonstring);
public class Root
{
public Profile[] Profile;
}
public class Profile
{
public string Name { get; set; }
public string Last { get; set; }
public Client Client { get; set; }
public DateTime Date { get; set; }
}
public class Client
{
public int ClientId;
public string Product;
public string Message;
}
Для этого вы можете использовать библиотеку JSON, например, Newtonsoft.Json, которая бесплатна. Он автоматически сопоставит json с вашими типами.
Образец:
public static T Deserialize<T>(string json)
{
Newtonsoft.Json.JsonSerializer s = new JsonSerializer();
return s.Deserialize<T>(new JsonTextReader(new StringReader(json)));
}
Существует также пакет NuGet.
Самый простой способ, которым я знаю, - это использовать JSON.Net от newtonsoft. Чтобы было легче понять, я всегда делаю соответствующие классы в C# с одинаковыми именами. Тогда его легче десериализовать. Например, если это массив объектов в js, он будет сопоставлен со списком объектов с такими же именами в C#. Что касается даты и времени, это немного сложно. Я выполняю проверку на стороне клиента и Datetime.tryParse на стороне сервера, он позаботится о тире или косой черте.
var serializer = new JavaScriptSerializer();
List<abc> abcList = serializer.Deserialize<List<abc>>(PassedInJsonString);
Я знаю, что это долгий вопрос, но я хотел бы добавить еще один вариант, который не использует сторонние библиотеки, а использует только стандартные библиотеки .Net и доступен, начиная с .Net Core 3.1.
Прежде всего, я оставляю ссылку на официальную документацию Microsoft (где вы найдете примеры сериализации и десериализации json-строк): https://docs.microsoft.com/en-us/dotnet/standard/serialization/system -text-json-как сделать
Давайте строить на вашем примере. У нас есть начальная строка json:
{
"Profile":[
{
"Name":"Joe",
"Last":"Doe",
"Client":{
"ClientId":"1",
"Product":"Apple",
"Message":"Peter likes apples"
},
"Date":"2012-02-14"
}
]
}
Если мы создадим структуру данных, которая может содержать это определение, это будет что-то вроде:
public class Root
{
public List<Profile> Profile { get; set; }
}
public class Profile
{
public string Name { get; set; }
public string Last { get; set; }
public Client Client { get; set; }
public string Date { get; set; }
}
public class Client
{
public string ClientId { get; set; }
public string Product { get; set; }
public string Message { get; set; }
}
Теперь, и, наконец , ответ на вопрос, как десериализовать строку json в конкретный объект без сторонних библиотек:
Root root = JsonSerializer.Deserialize<Root>(json);
Где
json
это переменная, содержащая вашу строку json.
Добавляю еще одну интересную ссылку, официальную документацию
Deserialize(...)
метод: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializer.deserialize
Что действительно полезно, так это исключение, которое можно генерировать,
JsonException
: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonexception
DataContractJsonSerializer выполняет свою работу, но он использует более сложный формат для сериализации DateTime.