【问题标题】:Getting parts of a repetitive string in C#在 C# 中获取重复字符串的一部分
【发布时间】:2019-12-20 03:14:06
【问题描述】:

提取字符串的一部分是一个常见的问题,但这里是字符串内容,例如' "main\":{\"temp\": ' 是重复的:

string test = "{\"cod\":\"200\",\"message\":0,\"cnt\":40,\"list\":[{\"dt\":1576810800,\"main\":{\"temp\":288.19,\"feels_like\":284.44,\"temp_min\":288.19,\"temp_max\":291.53,\"{\"dt\":1576821600,\"main\":{ \"temp\":283.97,\"feels_like\":281.56,\"temp_min\":283.97,\"temp_max\":286.47,\"pressure\":1007,\"sea_level\":1007,\"grnd_level\":997,\"humidity\":93,\"temp_kf\":-2.5},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rai\",\"icon\":\"10d\"}],\"clouds\":{\"all\":90},\"wind\"";

使用

string s = test.Substring(test.IndexOf("\"main\":{\"temp\":") + 15);

我明白了

288.19,"feels_like":284.44,,"temp_min":288.19,"temp_max":291.53,"{"dt":157682160
0,"main":{ "temp":283.97,"feels_like":281.56,"temp_min":283.97,"temp_max":286.47
,"pressure":1007,"sea_level":1007,"grnd_level":997,"humidity":93,"temp_kf":-2.5}
,"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10d"}],
"clouds":{"all":90},"wind"

而不是

288.19

知道什么命令会有所帮助吗?应该是可以适应“temp_max”或“pressure”的东西。

干杯

【问题讨论】:

  • 你是怎么得到那个字符串的?看起来 JSON 已损坏。如果它没有损坏,您可以使用 JSON 序列化程序,然后查询对象层次结构以获取您想要的“主临时”数组......但在它是有效的 JSON 之前,这是行不通的。
  • 这听起来像an X Y problem。您能解释一下test 字符串的来源以及您要做什么吗?我们也许能够提供一个更好的解决方案,只需搜索一个字符串
  • 我希望原始字符串是有效的 JSON,但在将其转换为 C# 时出现错误。
  • 当使用SubString()时,第一个参数是strart索引。您应该为所需的长度应用第二个参数。
  • Regex 始终是一个值得考虑的好选择。

标签: c# string parsing indexof


【解决方案1】:

感谢 Mohammed,这是吐出所有温度的工作代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;


namespace ConsoleApp2
{

    public class RootObject
    {
        public List<MyList> list { get; set; }
    }

    public class MyList
    {
        public Main main { get; set; }
    }

    public class Main
    {
        public double temp { get; set; }
    }

    class Program
    {
        static void Main()
        {
            using (WebClient client = new WebClient())
            {
                Console.WriteLine("ACCESSING ...");
                string test = client.DownloadString("http://api.openweathermap.org/data/2.5/forecast?q=Auckland,NZ&APPID=45c3e583468bf450fc17026d6734507e");
                //string test = "{\"cod\":\"200\",\"message\":0,\"cnt\":40,\"list\":[{\"dt\":1576810800,\"main\":{\"temp\":288.19,\"feels_like\":284.44,\"temp_min\":288.19,\"temp_max\":291.53,\"{\"dt\":1576821600,\"main\":{ \"temp\":283.97,\"feels_like\":281.56,\"temp_min\":283.97,\"temp_max\":286.47,\"pressure\":1007,\"sea_level\":1007,\"grnd_level\":997,\"humidity\":93,\"temp_kf\":-2.5},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rai\",\"icon\":\"10d\"}],\"clouds\":{\"all\":90},\"wind\"";

                var myobject = JsonConvert.DeserializeObject<RootObject>(test); //test is JSON response as string 

                foreach (var item in myobject.list)
                {
                    var temp = item.main.temp;
                    Console.WriteLine(temp);


                }

                Console.ReadLine();
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    使用

    var regexGroups = Regex.Matches(test, "\"main\" ?: ?{ ?\"temp\" ?: ?(\\d+\\.\\d+)")
        .Select(x => x.Groups[1].Value);
    

    您可以获得所有\"main\":{\"temp\": 值。

    【讨论】:

      【解决方案3】:
      //classes.cs
      public class RootObject
      {
          public List<MyList> list { get; set; }
      }
      
      public class MyList
      {
          public Main main { get; set; }
      }
      
      public class Main
      {
          public double temp { get; set; }
      }
      
      //API client
      using Newtonsoft.Json;
      
      var myobject = JsonConvert.DeserializeObject<RootObject>(test); //test is JSON response as string 
      
      foreach(var item in myobject.list){
        var temp = item.main.temp;
      }
      
      //Hope it helps
      

      【讨论】:

      • 酷,这有帮助。有没有办法将所有“主要温度”放在一个数组中,然后我访问它的 [x]?这样我就可以对所有值执行此操作,第一个始终是当前值,并且 [x+1] 是预测值等。谢谢!
      • 最干净和最快的选项是将 JSON 字符串反序列化为对象并获取数组。我将在回复中添加一些代码
      • 不用担心.. 你能把完整的test 测试字符串发给我以转换为 JSON 对象吗?
      • 我用 myobject 替换了 object 并用 myobject.list 替换了 list .. 这应该可以解决编译错误
      • 请用foreach(var item代替for(item
      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 2015-12-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      相关资源
      最近更新 更多