如何在 C# 中获取 json 属性的特定部分?

Posted

技术标签:

【中文标题】如何在 C# 中获取 json 属性的特定部分?【英文标题】:How to get specific part of json property in c#? 【发布时间】:2020-06-10 08:40:19 【问题描述】:

对这个json做一个循环,我总是需要能够从“value_name”中得到这个值“8047”:“https://www.portalinmobiliario.com/venta/departamento/estacion-central-metropolitana/8047-edificio-caiquen-nva”

你可以在 json 中看到,这有点大,所以如果你使用 ctrl + F 并查找它会更容易,但我放了完整的 json,这样你就可以很好地参考变量的方式我实际上需要得到。

  "results":[
      
         "id":283495,
         "user":
            "id":204841198,
            "nickname":"RICARDOCAMPOSANO",
            "registration_date":"2016-02-01T15:18:01Z",
            "first_name":"Ricardo",
            "last_name":"Camposano",
            "country_id":"CL",
            "email":"ricardo.camposano26@gmail.com",
            "phone":,
            "alternative_phone":,
            "identification":,
            "user_type":"normal",
            "tags":[],
            "points":0,
            "site_id":"MLC",
            "permalink":"http://perfil.mercadolibre.cl/RICARDOCAMPOSANO",
            "secure_email":"rcampos.l4jn3q@mail.mercadolibre.cl"
         ,
         "item":
            "id":"MLC462815278",
            "site_id":"MLC",
            "title":"Edificio Caiquén",
            "subtitle":"",
            "seller_id":330106543,
            "category_id":"MLC157523",
            "domain_id":"MLC-DEVELOPMENT_APARTMENTS_FOR_SALE",
            "price":1885,
            "base_price":1885,
            "original_price":0,
            "currency_id":"CLF",
            "price_conversions":[],
            "initial_quantity":330,
            "available_quantity":330,
            "sold_quantity":0,
            "buying_mode":"classified",
            "listing_type_id":"silver",
            "start_time":"2018-07-12T18:50:09Z",
            "stop_time":"2018-08-13T04:00:00Z",
            "condition":"new",
            "permalink":"http://departamento.mercadolibre.cl/MLC-462815278-edificio-caiquen-_JM",
            "thumbnail":"http://www.mercadolibre.com/jm/img?s=STC\u0026v=I\u0026f=processing_image_es.jpg",
            "secure_thumbnail":"https://www.mercadolibre.com/jm/img?s=STC\u0026v=I\u0026f=processing_image_es.jpg",
            "pictures":[],
            "video_id":"",
            "descriptions":[],
            "seller_address":,
            "seller_contact":,
            "location":,
            "attributes":[
               
                  "id":"ITEM_CONDITION",
                  "name":"Condición del ítem",
                  "value_id":"2230284",
                  "value_name":"Nuevo"
               ,
               
                  "id":"DOWN_PAYMENT",
                  "name":"Pie",
                  "value_id":"",
                  "value_name":"10 %"
               ,
               
                  "id":"RESERVATION_FEE",
                  "name":"Monto reserva",
                  "value_id":"",
                  "value_name":"0 UF"
               ,
               
                  "id":"CMG_SITE",
                  "name":"Sitio de origen",
                  "value_id":"",
                  "value_name":"POI"
               ,
               
                  "id":"CANONICAL_URL",
                  "name":"Url canónica",
                  "value_id":"",
                  "value_name":"https://www.portalinmobiliario.com/venta/departamento/estacion-central-metropolitana/8047-edificio-caiquen-nva"
               ,
               ,
               ,
               ,
               ,
               ,
               ,
               ,
               ,
               ,
               
            ],
            "variations":null,
            "listing_source":"portalinmobiliario",
            "status":"active",
            "tags":[

            ],
            "parent_item_id":"",
            "automatic_relist":false,
            "date_created":"2018-07-12T18:50:17Z",
            "last_updated":"2018-07-12T18:50:17Z"
         ,
         "variation":,
         "created_at":"2018-07-12T18:50:22Z",
         "is_guest":false
      
   ]

javascript 中,我可以这样做:

var id = id_proyecto = valor.item.attributes[4].value_name.match(/\/(\d+)-[^/]+$/)[1];

但我不知道如何在 c# 中做到这一点。我认为实际上更复杂。

任何线索如何解决这个问题?

【问题讨论】:

创建仅具有 value_name 属性的类,然后将您的 json 序列化为该类对象,然后循环并使用正则表达式 您好,您可以查看***.com/questions/11260631/… 了解如何将 JSON 转换为 C# 对象。在此之后,您可以在docs.microsoft.com/en-us/dotnet/api/… 处查看正则表达式的文档,了解如何在 C# 中使用正则表达式。 您找到解决问题的方法了吗? 【参考方案1】:

这是一个不使用正则表达式但使用IndexOf(...)Substring(...) 的解决方案

var value = valor.item.attributes[4].value_name;
var idxStart = value.LastIndexOf('/');
var idxEnd = value.IndexOf('-', idxStart);
var id = int.Parse(value.Substring(idxStart + 1, idxEnd - idxStart -1));

...你可以使用正则表达式

var value = valor.item.attributes[4].value_name;
var id = int.Parse(Regex.Match(value, @"/(\d+)\-[^/]+$").Groups[1].Value);

【讨论】:

是否需要导入任何库才能在 c# 控制台应用程序中使用 Regex? 只需将using System.Text.RegularExpressions 添加到类文件的顶部即可。无需其他参考 试过这个:var value = valor.item.attributes[4].value_name; var id= int.Parse(Regex.Match(value, @"/(\d+)\-[^/]+$").Groups[1].Value);并得到这个错误'System.Text.RegularExpressions.Regex.Match(string, string)' has some not valid arguments 刚刚将“value”变量的数据类型更改为字符串,它可以工作,感谢您的帮助

以上是关于如何在 C# 中获取 json 属性的特定部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 jQuery DataTables 获取 JSON 的某些部分

再谈MySQL JSON数据类型

如何快速从 HttpClient 返回的 JSON 中获取部分属性?

如何在 C# 中删除 Json 特定元素?

C#获取自定义属性扩展方法

如何检查 Json 是不是匹配特定的 C# 类型?