C#从JSON获取值



我有一个JSON文本,我想获得作者名称和描述标签的值。不需要其他领域,例如URL和URLTOIMAGE等。当我运行以下代码时,不会提供任何字符串值。我认为这里有一些错误。

{
  "status": "ok",
  "articles": [
  {
    "source": {
      "id": "techcrunch",
      "name": "TechCrunch"
    },
    "author": "Khaled "Tito" Hamze",
    "title": "Crunch Report",
    "description": "Your daily roundup of the biggest TechCrunch stories and startup news.",
    "url": "https://techcrunch.com/video/crunchreport/",
    "urlToImage": "https://tctechcrunch2011.files.wordpress.com/2015/03/tccrshowogo.jpg?w=500&h=200&crop=1",
    "publishedAt": "2017-12-11T20:20:09Z"
  },
  {
    "source": {
      "id": "techcrunch",
      "name": "TechCrunch"
    },
    "author": "Sarah Perez",
    "title": "Facebook is trying to make the Poke happen again",
    "description": "Facebook's "Poke" feature has never really gone away, but now the social network is giving it a more prominent placement - and is even considering expanding..",
    "url": "https://techcrunch.com/2017/12/11/facebook-is-trying-to-make-the-poke-happen-again/",
    "urlToImage": "https://tctechcrunch2011.files.wordpress.com/2017/12/facebook-poke-icon.jpg",
    "publishedAt": "2017-12-11T20:02:30Z"
  },
  {
    "source": {
      "id": "techcrunch",
      "name": "TechCrunch"
    },
    "author": "Sarah Perez",
    "title": "Amazon Alexa can now wake you up to music",
    "description": "This fall, Amazon made a play to become your new alarm clock with the introduction of a combination smart speaker and clock called the Echo Spot. Today, the..",
    "url": "https://techcrunch.com/2017/12/11/amazon-alexa-can-now-wake-you-up-to-music/",
    "urlToImage": "https://tctechcrunch2011.files.wordpress.com/2017/09/amazon-event-9270069.jpg",
    "publishedAt": "2017-12-11T17:22:30Z"
  },
  {
    "source": {
      "id": "techcrunch",
      "name": "TechCrunch"
    },
    "author": "Ingrid Lunden, Katie Roof",
    "title": "Apple confirms Shazam acquisition; Snap and Spotify also expressed interest",
    "description": "After we broke the story last week that Apple was acquiring London-based music and image recognition service Shazam, Apple confirmed the news today. It is..",
    "url": "https://techcrunch.com/2017/12/11/apple-shazam-deal/",
    "urlToImage": "https://tctechcrunch2011.files.wordpress.com/2017/12/shazam-app-icon-ios.jpg",
    "publishedAt": "2017-12-11T15:59:31Z"
  }
]}

如何得到这个?以下是我的代码,它根本不工作

var data = (JObject)JsonConvert.DeserializeObject(myJSON);
string nameArticles= data["articles"].Value<string>();
MessageBox.Show(nameArticles);

   public class Source
   {
    public string id { get; set; }
    public string name { get; set; }
   }
   public class Article
   {
    public Source source { get; set; }
    public string author { get; set; }
    public string title { get; set; }
    public string description { get; set; }
    public string url { get; set; }
    public string urlToImage { get; set; }
    public DateTime publishedAt { get; set; }
   }
            Article art = new Article();
            art = JsonConvert.DeserializeObject<Article>(myJSON);
            MessageBox.Show(art.description.ToString());

上面的代码返回对象未设置为实例错误!

data["articles"]可能是 JArray而不是字符串。您需要在上述 JArray中迭代每个 JObject,从而删除作者和描述值

var data = (JObject)JsonConvert.DeserializeObject(myJSON);
var articles = data["articles"].Children();
foreach (var article in articles)
{
    var author = article["author"].Value<string>();
    var description = article["author"].Value<string>();
    Console.WriteLine($"Author: " + author + ", Description: " + description);
}

这应该有助于您开始做任何事情。

如果您不想创建包装类别类,则可以尝试以下代码段,该代码段使用动态类型将JSON当选为对象。

var json = "Your JSON string";
dynamic stuff = JsonConvert.DeserializeObject(json);
string name = stuff.status;
var arr = stuff.articles;
foreach (var a in arr)
{
   var authorName = a.author;
}

假设您希望对具体类别化(根据问题中显示的第二次尝试的方法),那么您需要一个包装类才能保存整个对象,并对此进行审理。p>目前您正在尝试将整个对象序列序列到Article,但是只有该对象的articles数组中的各个对象才能匹配您的Article类中的结构。

您正在尝试在对象的错误级别上执行操作,而且您也忘记了articles是列表(数组)的事实。

类似的东西:

public class JSONResponse
{
    public string status { get; set; }
    public List<Article> articles { get; set; }
}

JSONResponse response = JsonConvert.DeserializeObject<JSONResponse>(myJSON);

然后,您可以使用普通循环通过response.articles列表进行迭代并提取作者姓名和描述。

示例JSON数据

string jsonString = "{"displayName":"Alex Wu","signInNames":[{"type":"emailAddress","value":"AlexW@example.com"},{"type":"emailAddress","value":"AlexW2@example.com"}]}";

将JSON转换为局限性,并使用名为SelectToken()

的内置方法获取值
JObject jObject = JObject.Parse(jsonString);
        string displayName = (string)jObject.SelectToken("displayName");
        string type = (string)jObject.SelectToken("signInNames[0].type");
        string value = (string)jObject.SelectToken("signInNames[0].value");
        Console.WriteLine("{0}, {1}, {2}", displayName, type, value);
        JArray signInNames = (JArray)jObject.SelectToken("signInNames");
        foreach (JToken signInName in signInNames)
        {
            type = (string)signInName.SelectToken("type");
            value = (string)signInName.SelectToken("value");
            Console.WriteLine("{0}, {1}",  type, value);
        }

谢谢

您的JSON在一组class

集中
public class Source
{ 
  public string id { get; set; } 
  public string name{get;set;}
}
public class Article
{
public Source source { get; set; }
public string author { get; set; }
public string title { get; set; }
public string description { get; set; }
public string url { get; set; }
public string urlToImage { get; set; }
public DateTime publishedAt { get; set; }
}
public class RootObject
{
public string status { get; set; }
public List<Article> articles { get; set; }
}

因此,您可以通过以下方式对此进行审理。

var data = JsonConvert.DeserializeObject<RootObject>(myJSON);
nameArticles=data.articles.FirstOrDefault().description;
MessageBox.Show(nameArticles);

请为您的JSON文件创建一个类,并为所有标签添加属性然后写代码如下:

public class exampleJson{
public string author {get;set;}
public string description {get;set;}
.....
}
var data = JsonConvert.DeserializeObject<exampleJson>(myJSON);
string authorName = data.author;
string descriptions = data.description ;

相关内容

  • 没有找到相关文章

最新更新