Привязка WebAPI — Десериализует часть входящего json в JToken

#c# #json #asp.net-web-api #json.net #json-deserialization

#c# #json #asp.net-web-api #json.net #json-десериализация

Вопрос:

Я пытаюсь десериализовать этот json в модель:

 {
"settings": [
    {
    "name": "setting1",
    "value": {
        "key": "value"
        }
    }, 
    {
    "name": "setting2",
    "value": 10
 }
]
}
  

Как вы можете видеть, my value может быть либо простым значением, таким как int, или string, либо это может быть другой объект json.

Моя цель здесь — десериализовать значение в JToken или a string .

Я пытался десериализовать с помощью Json.NET, насколько я знаю, WebAPI использует его под капотом.

Это то, что я пытался:

   public class SettingsBatch
  {
    [JsonProperty(PropertyName = "settings")]
    public List<SettingInBatch> Settings { get; set; }
  }

  public class SettingsInBatch
 {
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }

    [JsonProperty(PropertyName = "value")]
    public object Value { get; set; }
 }
  

Из моих тестов (пожалуйста, прочитайте комментарии в строке):

 [JsonProperty(PropertyName = "value")]
public string Value { get; set; } // deserialization fails when "value" is a JsonObject

[JsonProperty(PropertyName = "value")]
public JToken Value { get; set; } // deserialization fails always

[JsonProperty(PropertyName = "value")]
public Object Value { get; set; } // deserialization works fine, what's curios 
// is that if the value is a json object the Object type is JToken 
// (just that I have to cast it). If it's an int or a string
// obviously the type is int / string so I would have to 
//construct somehow a JToken. 
  

Как я могу этого добиться?

Комментарии:

1. Вы пытались прочитать содержимое запроса в виде строки, а затем использовать Request.Content.ReadAsStringAsync ? Затем вы можете выполнить любой ручной синтаксический анализ JSON со строкой полезной нагрузки. Это удобно, когда входящий JSON не всегда имеет одну и ту же «схему».

2. Я этого не делал, я уверен, что смогу разобрать его пользовательским способом, мне было интересно, есть ли возможность использовать существующий фреймворк.