Десериализовать ExpandoObject в объект - PullRequest
0 голосов
/ 03 августа 2020

У меня есть объект, который будет использоваться с несколькими клиентами. У объекта есть набор фиксированных свойств, общих для всех клиентов. Вот пример того, как может выглядеть объект:

public class Applicant
{
    public string ApplicantId { get; set; }
    public string ProducerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    ...

    public List<dynamic> Information { get; set; }
}

Мы будем получать это через POST веб-API. Итак, у меня есть эта подпись контроллера:

[HttpPost]
    public void Post([FromBody] dynamic value)
    {
        var converter = new ExpandoObjectConverter();
        dynamic input = JsonConvert.DeserializeObject<Loan>(value,converter);


    }

Но когда я запускаю этот код, NewtonSoft продолжает выдавать мне ошибку

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Лучшая перегруженная соответствие метода для Newtonsoft. Json .JsonConvert.DeserializeObject (string, params Newtonsoft. Json .JsonConverter []) 'имеет некоторые недопустимые аргументы'

При осмотре выясняется, что возникла проблема с переданным типом Dynami c. Итак, как мне передать этот JSON, чтобы я мог проанализировать его с помощью ExpandoObjectConverter?

Ответы [ 2 ]

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

Это не отвечает на вопрос с использованием Dynami c, но стоит подумать о том, чтобы избежать этого, используя словарь вместо моделирования пользовательских свойств. Следующее работает для общих пар ключ / значение c:

public class Applicant
{
   ...Standard properties

   public IDictionary<string, object> Custom { get; set; }
}

Он принимает JSON с произвольными динамическими c полями, вложенными в ваше «пользовательское» пространство имен:

{
    "applicationId": "123",
    "producerId": "456",
    "custom": {
        "favoriteAnimal": "turtles",
        "someRandomMetadata": 42,
        "someUnforeseenList": ["foo", "bar"]
    }
 }

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

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

Фреймворк очень хорош в сериализации и десериализации. Нет причин использовать Dynami c, если вы уже знаете переданную модель. Поэтому вам нужно просто сделать это:

[HttpPost]
public IActionResult Post([FromBody] Loan value)
{
    // Loan is already instantiated with your data. You can use the object now.
    return Ok(value); // <-- for example
}

Говоря о наличии dynamic объектов в ваших моделях:

Я не могу говорить о реализации Microsoft JSON, но Newtonsoft.Json прекрасно справляется с этим. Допустим, ваша модель Loan выглядела так:

public sealed class Loan
{
    [JsonProperty("name")]
    public string Name { get; set; }
    
    [JsonProperty("myDynamicStuff")]
    public dynamic MyDynamicStuff { get; set; }
 }

Приведенный выше код контроллера десериализовал бы это нормально без каких-либо дополнительных усилий.

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