Файл JSON из URL в объект JSON

#c# #json #api #asp.net-core #url

Вопрос:

После запроса API я получаю файл JSON(родительский) с некоторыми URL-адресами других файлов JSON(дочерних). Можно ли загрузить все файлы и преобразовать дочерние файлы в объекты JSON в родительском файле?

Это очень ASP.Net Приложение Core 3.1, написанное на C#.

Пример Ввода:

 [
    {
        "title": "AAA",
        "dates": [
            {
                "a_date": "24.09.2021",              
                "push": false,
                "date_url": "https://www-api.aaa.com/api/HEUFCCEWJHB=.json"
            },
            {
                "a_date": "27.09.2021",              
                "push": false,
                "date_url": "https://www-api.aaa.com/api/VFEWVWEWXS=.json"
            }
        ]
    },
    {
        "title": "BBB",
        "dates": [
            {
                "a_date": "24.10.2021",              
                "push": false,
                "date_url": "https://www-api.aaa.com/api/HBTFDECEC=.json"
            },
            {
                "a_date": "27.10.2021",              
                "push": false,
                "date_url": "https://www-api.aaa.com/api/EWFEWIFWEW=.json"
            }
        ]
    }
]
 

Ожидаемые результаты:

     [
    {
        "title": "AAA",
        "dates": [
            {
                "a_date": "24.09.2021",              
                "push": false,
                "date_url": [
                    {
                        "aa": "xx",              
                        "bb": false,
                    },
                    {
                        "aa": "zzz",              
                        "cc": true,
                    }
                ]
            },
            {
                "a_date": "27.09.2021",              
                "push": false,
                "date_url": [
                    {
                        "aa": "xx",              
                        "bb": false,
                    },
                    {
                        "aa": "zzz",              
                        "cc": true,
                    }
                ]
            }
        ]
    },
    {
        "title": "BBB "
        ...
    }
]
 

По желанию:

В конце родительский JSON должен быть разделен на разные файлы JSON по названию.

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

1. Вы хотите, чтобы он использовался Newtonsoft.Json или System.Text.Json ?

2. Кроме того, как следует делать веб-запросы? Используете ли вы определенный метод, нужны ли вам какие-либо пользовательские заголовки?

3. Что вы "aa","bb","cc" подразумеваете под Ожидаемым результатом?

4. @trinalbadger587 Я предпочитаю Newtonsoft.Json. Это простой http-запрос, в котором требуются любые пользовательские заголовки.

5. @YiyiYou, это всего лишь образец данных о ребенке

Ответ №1:

Вы можете попробовать этот конвертер:

 public class UrlDownloaderConverter : JsonConverter<object>
{
    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        => JsonSerializer.Deserialize(DownloadJson(reader.GetString()), typeToConvert, options);

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
        => JsonSerializer.Serialize(writer, value, value.GetType(), options);

    public static string DownloadJson(string url)
    {
        using (HttpClient httpClient = new HttpClient())
        using (HttpResponseMessage msg = httpClient.GetAsync(url).Result)
        using (HttpContent content = msg.Content)
            return content.ReadAsStringAsync().Resu<
    }
}
 

Пример Использования

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

1. Спасибо вам за ваш ответ. Есть и другая проблема: имена объектов в дочерних JSONs разные, поэтому я не могу сопоставить их с моделью.

2. @AlexanderS., Я не понимаю, что вы имеете в виду. Кроме того, я не знаю Newtonsoft.Json , поэтому не могу вам в этом помочь.

3. Вместо «aa», «bb», «cc»могут быть сотни других имен. Я не могу добавить их все в модель.

4. @AlexanderS., вам придется задать это в отдельном вопросе, так как я не знаю контекста, но из того, что вы мне сказали, я понятия не имею. Вам, вероятно, придется написать пользовательский конвертер, чтобы преобразовать его в нужный вам объект.

5. ОК. Спасибо вам за вашу помощь! Теперь у меня есть идея, как я могу ее решить. Может быть, я опубликую это позже.