【问题标题】:How to Parse an example string in C# [duplicate]如何在 C# 中解析示例字符串 [重复]
【发布时间】:2016-12-01 03:05:21
【问题描述】:

我有这个字符串

[
    {
        "url_short":"http:\/\/sample.com\/8jyKHv",
        "url_long":"http:\/\/www.sample.com\/",
        "type":0
    }
]

我想要的是得到http:\/\/sample.com\/8jyKHv并将其翻译成

http://sample.com/8jyKHv

有可能吗?

【问题讨论】:

  • 这里有 2 个选项。要么将其视为字符串并使用子字符串并替换。您可以将其视为 JSON 并将其反序列化为类对象。两者都会产生预期的结果
  • 查看 stackoverflow.com/questions/11260631/… 了解 JSON 反序列化方法——我推荐使用子字符串解决方案
  • 是的,强烈推荐JSON方式,而不是string/substring/replace方式。

标签: c# json string parsing


【解决方案1】:

这个字符串是 JSON。

你可以使用JSON.NET解析它。

例子:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class RootObject
{
    public string url_short { get; set; }
    public string url_long { get; set; }
    public int type { get; set; }
}

public class Program
{
    static public void Main()
    {
        string j = "[{\"url_short\":\"http:\\/\\/sample.com\\/8jyKHv\",\"url_long\":\"http:\\/\\/www.sample.com\\/\",\"type\":0}]";

        List<RootObject> ro = JsonConvert.DeserializeObject<List<RootObject>>(j);

        Console.WriteLine(ro[0].url_short);                 
    }    
}

回复:

http://sample.com/8jyKHv

【讨论】:

    【解决方案2】:

    试试这个

    创建一个如下所示的类

    注意:您可以使用 Visual Studio 中的“选择性粘贴”选项来生成与 JSON 相关的所有类

    编辑 -> 选择性粘贴 -> 将 Json 粘贴为类

    它将创建所有与 JSON 相关的类

        public class url_details
        {
            public string url_short { get; set; }
            public string url_long { get; set; }
            public int type { get; set; }
        }
    
    
        public List<url_details> json_deserialized()
        {
            string json = "[{\"url_short\":\"http:\\/\\/sample.com\\/8jyKHv\",\"url_long\":\"http:\\/\\/www.sample.com\\/\",\"type\":0}]";
    
            List<url_details> items = new List<url_details>();
            items = JsonConvert.DeserializeObject<List<url_details>>(json);
    
            return items;
        }
    

    你可以像下面这样访问元素

       List<url_details> obj = json_deserialized();
    
       string url_short = obj[0].url_short;
    

    【讨论】:

      【解决方案3】:

      肯定推荐 JSON 方式,但不能说明太多。这是正则表达式的替代方法:

      Regex rgxUrl = new Regex("\"url_short\":\"(.*?)\",\"");
      Match mUrl = rgxUrl.Match(yourString);
      
      string url = Regex.Replace(mUrl.Groups[1].Value, @"\", "");
      

      【讨论】:

      • 必须是 Regex.Replace(mUrl.Groups[1].Value, @"\\", "");
      • @AJB 不。 @ 已经在转义字符串。 "\\"@"\"
      【解决方案4】:

      该字符串是一个 JSON 字符串,因此您可以创建一个类来获取这样的值

      public class Rootobject
      {
          public Class1[] Property1
          {
              get;
              set;
          }
      }
      
      public class Class1
      {
          public string url_short
          {
              get;
              set;
          }
          public string url_long
          {
              get;
              set;
          }
          public int type
          {
              get;
              set;
          }
      }
      

      上完这堂课就可以得到这样的数据了

      string json = "[{"url_short":"http:\/\/sample.com\/8jyKHv","url_long":"http:\/\/www.sample.com\/","type":0}]";
      List<Rootobject> ro = JsonConvert.DeserializeObject<List<Rootobject>>(json);
      string ururl = ro[0].Propert1[0].url_short;
      

      【讨论】:

      • 删除 \ 已过时,因为在反序列化后它已经消失。您的 json 示例字符串错误(缺少“\”)。请参阅json.org 了解规格
      • 剩下一个错误:json 包含一个对象数组;o)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2014-11-09
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 2016-02-04
      相关资源
      最近更新 更多