Как сопоставить 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.

Другие вопросы по тегам