Десериализовать JSON с использованием указанных свойств c - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь десериализовать JSON, не объявляя каждое свойство в C#. Вот сокращенный отрывок JSON:

{
    "resourceType": "export",
    "type": "search",
    "total": 50,
    "timestamp": "2020-08-02T18:26:06.747+00:00",
    "entry": [
        {
            "url": "test.com/123",
            "resource": {
                "resourceType": "Slot",
                "id": [
                    "123"
                ],
                
                "schedule": {
                    "reference": {
                        "value": "testvalue"
                    }
                },
                "status": "free",
                "start": "2020-08-03T08:30+01:00",
                "end": "2020-08-03T09:00+01:00"
            }
        }
   ]
}

Я хочу получить значения из entryresource, id и start.

Есть предложения, как это лучше сделать?

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Я получил очень хороший опыт работы с json2sharp . Вы можете ввести туда свои данные JSON, и он сгенерирует классы, необходимые для десериализации данных JSON.

public class Reference    
{
    public string value { get; set; } 
}

public class Schedule    
{
    public Reference reference { get; set; } 
}

public class Resource    
{
    public string resourceType { get; set; } 
    public List<string> id { get; set; } 
    public Schedule schedule { get; set; } 
    public string status { get; set; } 
    public string start { get; set; } 
    public string end { get; set; } 
}

public class Entry    
{
    public string url { get; set; } 
    public Resource resource { get; set; } 
}

public class Root    
{
    public string resourceType { get; set; } 
    public string type { get; set; } 
    public int total { get; set; } 
    public DateTime timestamp { get; set; } 
    public List<Entry> entry { get; set; } 
}

Следующим шагом является выбор фреймворка, который поможет вам десериализовать . Что-то вроде Newtonsoft JSON.

Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
0 голосов
/ 05 августа 2020

Если вы хотите получить данные без объявления классов, вы можете использовать Json. Net LINQ-to- JSON API (JToken, JObject, et c. ). Вы можете использовать метод SelectToken с выражением JsonPath , чтобы получить то, что вы ищете, в нескольких строках. Обратите внимание, что .. - это оператор рекурсивного спуска.

JObject obj = JObject.Parse(json);
List<string> ids = obj.SelectToken("..resource.id").ToObject<List<string>>();
DateTimeOffset start = obj.SelectToken("..resource.start").ToObject<DateTimeOffset>();

Здесь рабочая демонстрация: https://dotnetfiddle.net/jhBzl4

Если окажется, что на самом деле записей несколько, и вы хотите получить значения id и start для всех из них, вы можете использовать такой запрос:

JObject obj = JObject.Parse(json);
var items = obj["entry"]
    .Children<JObject>()
    .Select(o => new 
    {
        ids = o.SelectToken("resource.id").ToObject<List<string>>(),
        start = o.SelectToken("resource.start").ToObject<DateTimeOffset>()
    })
    .ToList();

Демо: https://dotnetfiddle.net/Qe8NB7

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

Я не уверен, почему вы не десериализуете лот (даже если он минимально заполнен), поскольку вам все равно нужно выполнять внутренние классы.

Вот как вы можете обойти некоторые классы (1 ), покопавшись в JObjects

Учитывая

public class Reference  
{
   public string value { get; set; } 
}

public class Schedule   
{
   public Reference reference { get; set; } 
}

public class Resource  
{
   public string resourceType { get; set; } 
   public List<string> id { get; set; } 
   public Schedule schedule { get; set; } 
   public string status { get; set; } 
   public string start { get; set; } 
   public string end { get; set; } 
}

public class Entry
{
   public string url { get; set; } 
   public Resource resource { get; set; } 
}

Вы можете позвонить

var results = JObject.Parse(input)["entry"]
                     .Select(x => x.ToObject<Entry>());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...