Как сохранить только » в C # string

#c# #json

#c# #json

Вопрос:

Я хочу получить JSON из string, и мне нужно извлечь «вместо » в моем коде.

Вот мой код, в котором я хочу его использовать:

 internal static string ReturnRedditJsonPage(string subredditname)
{
    return 
    $"https://reddit.com/r/{subredditname}.json";
}
internal static Reddit ParseReddit(string subredditname)
{
    WebResponse response = HttpWebRequest.CreateHttp(ReturnRedditJsonPage(subredditname)).GetResponse();
    string responseContent = new StreamReader(response.GetResponseStream()).ReadToEnd().Replace("\",@"").Replace(""",((char)0x0022).ToString()).Trim();
    return JsonConvert.DeserializeObject<Reddit>(responseContent);
}
internal static Uri[] GetMemesLinks(string subredditname)
{
    Reddit jsonData = ParseReddit(subredditname);
    List<Uri> result = new List<Uri>();
    foreach(Child child in jsonData.Data.Children)
    {
        result.Add(child.Data.Url);
    }
    return result.ToArray();
}
  

Это возвращает мне JSON, который я не могу разобрать из-за » в строке вместо «. Как я могу это исправить?

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

1. Пожалуйста, опубликуйте данные JSON, которые вы получаете

2. Добро пожаловать в Stack Overflow. Мне трудно понять вопрос — пожалуйста, не могли бы вы показать фактический JSON, который вы получаете обратно? Также обратите внимание, что вы должны записать это в файл или распечатать на консоли или аналогично, а не просто искать в отладчике — иначе вы увидите экранированную форму.

3. Использование » вы просто сообщаете компилятору, что конкретно » не завершает вашу строку, а является ее частью. И если вы используете Replace («»», «»»), вы просто удаляете » из вашей строки не «. Если вы хотите удалить » фрагмент из вашей строки, вам придется ввести Replace(«\»», «»)

4. Replace("\",@"") Ну, это довольно бессмысленная замена. И так Replace(""",((char)0x0022).ToString()) . Потому что обе операции замены заменяют что-то одним и тем же чем-то; т. е. ничего не меняют…

5. Я предлагаю потратить некоторое время на изучение руководства по C #, посвященного строкам, строковым литералам и тому, как (определенные) символы экранируются в строковых литералах C #. Ваши попытки string.replace выглядят так, как будто вы не понимаете / не можете прочитать escape-последовательности строк…

Ответ №1:

Вы можете использовать JSON.NET в сочетании с небольшой магией LINQ для извлечения всех URI из API-интерфейса reddit.


Вот демо, настройте в соответствии с вашими требованиями:

 internal static string ReturnRedditJsonURI(string SubRedditName)
{
    return $"https://reddit.com/r/{SubRedditName}.json";
}

// Does a HTTP GET request to the external Reddit API to get contents and de-serialize it
internal static async Task<JObject> ParseReddit(string SubRedditName)
{
       string exampleURI = ReturnRedditJsonURI(SubRedditName);

       JObject response = new JObject();
       using (HttpClient client = new HttpClient())
       {
            // Make the HTTP request now
            HttpResponseMessage msg = await client.GetAsync(exampleURI);

            // If HTTP 200 then go ahead and de-serialize
            if (msg.IsSuccessStatusCode)
            {   
                string responseBody = await msg.Content.ReadAsStringAsync();
                response = JsonConvert.DeserializeObject<JObject>(responseBody);
            }
       }
       return response;
}

// Driver method to extract the URI(s) out of the reddit response
internal static async Task<List<Uri>> GetRedditURI(string SubRedditName)
{
    string subRedditName = "Metallica";
    JObject redditData = await ParseReddit(SubRedditName);

    List<Uri> redditURIList = new List<Uri>();

    try 
    {
        // TODO: instead of JObject use concrete POCO, but for now this seems to be it.

        redditURIList = redditData["data"]?["children"]?
            .Select(x => x["data"])
            .SelectMany(x => x)
            .Cast<JProperty>()
            .Where(x => x.Name == "url")
            .Select(x => x.Value.ToString())
            .Select(x => new Uri(x, UriKind.Absolute)).ToList() ?? new List<Uri>();

        return redditURIList;
    }
    catch (Exception ex)
    {
        return redditURIList;
    }
}