Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#从json获取值_C#_Json_Json.net - Fatal编程技术网

c#从json获取值

c#从json获取值,c#,json,json.net,C#,Json,Json.net,我有一个json文本,我想获得author name和description标记的值。不需要url和urltoimage等其他字段。 当我运行下面的代码时,它不提供任何字符串值。我想这里有些错误 { "status": "ok", "articles": [ { "source": { "id": "techcrunch", "name": "TechCrunch" }, "author": "Khaled \"Tito\" Hamze

我有一个json文本,我想获得author name和description标记的值。不需要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());
var data=(JObject)JsonConvert.DeserializeObject(myJSON);
字符串名称articles=data[“articles”].Value();
MessageBox.Show(nameArticles);
公共类源
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
}
公共类文章
{
公共源{get;set;}
公共字符串作者{get;set;}
公共字符串标题{get;set;}
公共字符串说明{get;set;}
公共字符串url{get;set;}
公共字符串urlToImage{get;set;}
public DateTime publishedAt{get;set;}
}
Article art=新文章();
art=JsonConvert.DeserializeObject(myJSON);
MessageBox.Show(艺术描述.ToString());
上面的代码返回对象未设置为实例错误

使用

示例:

        String[] your_json_file = Directory.GetFiles("C:\your_folder", json_file_name.json", SearchOption.AllDirectories);
        foreach (string s in your_json_file)
        {
            JObject JSON = JObject.Parse(File.ReadAllText(s));
            string AutorName = (string)JSON["author"];
            string Description = (string)JSON["description"];
        }

请为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 ;
public类exampleJson{
公共字符串作者{get;set;}
公共字符串说明{get;set;}
.....
}
var data=JsonConvert.DeserializeObject(myJSON);
字符串authorName=data.author;
字符串描述=data.description;

假设您希望反序列化到具体的类(按照您问题中尝试的第二种方法),那么您需要一个包装类来保存整个对象,并反序列化到该类

目前,您正试图将整个对象序列化为一篇
文章
,但只有该对象的
文章
数组中的单个对象才能与
文章
类中的结构匹配

您试图在对象的错误级别执行操作,并且忘记了
articles
是一个列表(数组)

大概是这样的:

public class JSONResponse
{
    public string status { get; set; }
    public List<Article> articles { get; set; }
}
公共类JSONResponse
{
公共字符串状态{get;set;}
公共列表项目{get;set;}
}

JSONResponse-response=JsonConvert.DeserializeObject(myJSON);

然后,您可以使用一个普通循环来迭代
响应.articles
列表并提取作者姓名和描述。

您的Json生成以下一组类

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; }
}
公共类源代码
{ 
公共字符串id{get;set;}
公共字符串名称{get;set;}
}
公共类文章
{
公共源{get;set;}
公共字符串作者{get;set;}
公共字符串标题{get;set;}
公共字符串说明{get;set;}
公共字符串url{get;set;}
公共字符串urlToImage{get;set;}
public DateTime publishedAt{get;set;}
}
公共类根对象
{
公共字符串状态{get;set;}
公共列表项目{get;set;}
}
因此,您可以通过以下方式对其进行反序列化

var data = JsonConvert.DeserializeObject<RootObject>(myJSON);
nameArticles=data.articles.FirstOrDefault().description;
MessageBox.Show(nameArticles);
var data=JsonConvert.DeserializeObject(myJSON);
nameArticles=data.articles.FirstOrDefault().description;
MessageBox.Show(nameArticles);
数据[“文章”]
可能是
JArray
而不是字符串。您需要在前面提到的
JArray
中迭代每个
JObject
,提取author和description值

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);
}
var data=(JObject)JsonConvert.DeserializeObject(myJSON);
var articles=data[“articles”].Children();
foreach(条款中的var条款)
{
var author=article[“author”].Value();
var description=article[“author”].Value();
Console.WriteLine($“Author:+Author+”,Description:+Description);
}

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

如果您不想创建包装类,可以尝试下面的代码段,它使用to


示例json数据

string jsonString = "{\"displayName\":\"Alex Wu\",\"signInNames\":[{\"type\":\"emailAddress\",\"value\":\"AlexW@example.com\"},{\"type\":\"emailAddress\",\"value\":\"AlexW2@example.com\"}]}";
将json转换为jObject,并使用名为selectToken()的内置方法获取值。


谢谢

数据[“文章”]
可能是
JArray
而不是字符串。您需要在前面提到的
JArray
中迭代每个
JObject
,提取
author
description
值。@phuzi您能展示一些示例代码吗?请看下面我的答案1。他们使用的是Json.NET2<代码>“author”和
“description”
不是示例中所示的顶级属性。虽然反序列化到具体类可能有好处,但也完全有效。虽然反序列化到具体类可能有好处,也完全有效。虽然反序列化到具体类可能有好处,但也完全有效。@crashmstr这当然是一个同样有效的选择。然而,OP的代码似乎暗示他们想要在o类中反序列化,但却很难正确地做到这一点,所以我的答案是使用相同的方法构造的。你认为答案在任何方面都是错误的吗?他们有两块代码,一块在顶部使用LINQ到JSON,另一块试图反序列化到更远的类。所以他们真正想要的是什么是模棱两可的。我不认为你的答案是错误的,但我认为更好的措辞是,如果他们想反序列化到一个类,他们需要在整个结构的顶层进行反序列化。@Crashstr我添加了一点澄清。我认为这些更改使这是一个更好的答案。感谢这个解决方案,经过这么多的努力,找到了这个,它成功了。!
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;
}
string jsonString = "{\"displayName\":\"Alex Wu\",\"signInNames\":[{\"type\":\"emailAddress\",\"value\":\"AlexW@example.com\"},{\"type\":\"emailAddress\",\"value\":\"AlexW2@example.com\"}]}";
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);
        }