JSON десериализовать, чтобы выбрать класс - PullRequest
0 голосов
/ 09 мая 2018

У меня проблема, как это сделать красиво.

У меня есть строка с JSON, и я хочу изменить ее на класс.

Я знаю, что могу использовать этот код:

var json = JsonConvert.DeserializeObject<MyClass>(stringJson);

Проблема в том, что у меня есть несколько классов, и я не знаю, как правильно выбрать, какой класс использовать.

Я знаю один способ сделать это, но я думаю, что это неприятно.Например:

try
{
    var json = JsonConvert.DeserializeObject<MyClass1>(stringJson);
}
catch()
{}
try
{
    var json = JsonConvert.DeserializeObject<MyClass2>(stringJson);
}
catch()
{}

Есть ли другой способ сделать это?

Редактировать:

У меня есть 8-10 разных версий того, что я могу получить, и во всех версиях Iзнать, как это будет выглядеть (номер версии может измениться).

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы можете проанализировать JObject, чтобы выбрать точный тип в соответствии с вашими правилами. Вы даже можете использовать LINQ и другие модные вещи.

Например, давайте возьмем такую ​​структуру сообщения:

{
    "type": "info",
    "data" : { 

    }
}

тогда у вас есть:

JObject parsed = JObject.Parse(stringJson);
var type = parsed["type"].Value<string>();

switch(type)
{
    case "info":
        {
            // got an info
            // You can parse the exact property you need, not the whole object
            var result = JsonConvert.DeserializeObject<Info>(parsed["data"].ToString());
            break;
        }
    case "error":
        {
            // got an error
            var result = JsonConvert.DeserializeObject<Error>(parsed["data"].ToString());
            break;
        }
}

Если вы не можете контролировать формат json, вы можете использовать любые доказательства, чтобы определить точный тип

0 голосов
/ 09 мая 2018

Метод 1

Как я уже говорил, вы должны использовать object в этом случае:

var json = JsonConvert.DeserializeObject<JObject>(stringJson);

И внутри вашего JObject вы должны отправить свой класс и switch это, например:

string type = json["type"].ToString();

switch(type) 
{

    case "MyClass":
         //do whatever...
         break;

    case "MyClass1":
         //do whatever...
         break;

    case "MyClass2":
         //do whatever...
         break;

}

Метод 2

Я написал ошибку, да, я пропустил это (вы можете использовать метод ToObject):

var json = JsonConvert.DeserializeObject<JObject>(stringJson);

string type = json.ToObject<object>().GetType().Name;

И сделать switch, как в Метод 1

Метод 3

Кроме того, вы можете наследовать от base class:

public class MyClass 
{

}

public class MyClass1 : MyClass
{

}

public class MyClass2 : MyClass
{

}

//And so on...

Если это не то, что вам нужно, пожалуйста, скажите мне.

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