【问题标题】:Retrieve required string from bigger JSON string从更大的 JSON 字符串中检索所需的字符串
【发布时间】:2015-07-21 06:02:22
【问题描述】:

我有方法返回的 JSON 字符串:

public List<Issues> Getdata(
        string jql,
        List<string> fields = null,
        int startAt = 0,
        int maxResult = 500)
    {
        string data = JsonConvert.SerializeObject(request);
        string result = runQuery(JiraResource.search, data, "POST"); //returns results and working fine
        SearchResponse response = JsonConvert.DeserializeObject<SearchResponse>(result);
        return response.IssueDescriptions = GetIssues(response);;
    }

JSON 字符串如下所示:

{"expand":"schema,names","startAt":0,"maxResults":50,"total":139,"issues":[{"expand":"operations,versionedRepresentations,editmeta,changelog,transitions,renderedFields","id":"20930","self":"https://clientname.atlassian.net/rest/api/2/issue/20930","key":"-139","fields":{"summary":"Rebate","issuetype":{"self":"https://clientname.atlassian.net/rest/api/2/issuetype/1","id":"1","description":"A fee negotiation or quote","iconUrl":"https://clientname.atlassian.net/images/icons/issuetypes/sales.png","name":"Fees","subtask":false},"components":[],"created":"2015-07-10T12:29:05.000+1000","description":"Execute as per attached instruction","project":{"self":"https://clientname.atlassian.net/rest/api/2/project/10013","id":"10013","key":"--","name":"Change Instructions","avatarUrls":{"48x48":"https://clientname.atlassian.net/secure/projectavatar?avatarId=10011","24x24":"https://clientname.atlassian.net/secure/projectavatar?size=small&avatarId=10011","16x16":"https://clientname.atlassian.net/secure/projectavatar?size=xsmall&avatarId=10011","32x32":"https://clientname.atlassian.net/secure/projectavatar?size=medium&avatarId=10011"}},"reporter":{"self":"https://clientname.atlassian.net/rest/api/2/user?username=rajap","name":"rajap","key":"rajap","emailAddress":"email.au","avatarUrls":{"48x48":"https://clientname.atlassian.net/secure/useravatar?avatarId=10142","24x24":"https://clientname.atlassian.net/secure/useravatar?size=small&avatarId=10142","16x16":"https://clientname.atlassian.net/secure/useravatar?size=xsmall&avatarId=10142","32x32":"https://clientname.atlassian.net/secure/useravatar?size=medium&avatarId=10142"},"displayName":"Prabu","active":true,"timeZone":"US"},"priority":{"self":"https://clientname.atlassian.net/rest/api/2/priority/3","iconUrl":"https://clientname.atlassian.net/images/icons/priorities/major.png","name":"Medium","id":"3"},"resolution":null,"duedate":"2015-07-15","comment":{"startAt":0,"maxResults":1,"total":1,"comments":[{"self":"https://clientname.atlassian.net/rest/api/2/issue/20930/comment/24290","id":"24290","author":{"self":"https://clientname.atlassian.net/rest/api/2/user?username=acahill","name":"acahill","key":"acahill","emailAddress":"email","avatarUrls":{"48x48":"https://clientname.atlassian.net/secure/useravatar?avatarId=10142","24x24":"https://clientname.atlassian.net/secure/useravatar?size=small&avatarId=10142","16x16":"https://clientname.atlassian.net/secure/useravatar?size=xsmall&avatarId=10142","32x32":"https://clientname.atlassian.net/secure/useravatar?size=medium&avatarId=10142"},"displayName":"Andrew Cahill","active":true,"timeZone":"US"},"body":"John, please action","updateAuthor":{"self":"https://clientname.atlassian.net/rest/api/2/user?username=acahill","name":"acahill","key":"acahill","emailAddress":"email","avatarUrls":{"48x48":"https://clientname.atlassian.net/secure/useravatar?avatarId=10142","24x24":"https://clientname.atlassian.net/secure/useravatar?size=small&avatarId=10142","16x16":"https://clientname.atlassian.net/secure/useravatar?size=xsmall&avatarId=10142","32x32":"https://clientname.atlassian.net/secure/useravatar?size=medium&avatarId=10142"},"displayName":"Andrew","active":true,"timeZone":"US"},"created":"2015-07-10T12:35:43.728+1000","updated":"2015-07-10T12:35:43.728+1000"}]},"votes":{"self":"https://clientname.atlassian.net/rest/api/2/issue/-139/votes","votes":0,"hasVoted":false},"assignee":{"self":"https://clientname.atlassian.net/rest/api/2/user?username=olearyj","name":"olearyj","key":"olearyj","emailAddress":"email","avatarUrls":{"48x48":"https://clientname.atlassian.net/secure/useravatar?avatarId=10142","24x24":"https://clientname.atlassian.net/secure/useravatar?size=small&avatarId=10142","16x16":"https://clientname.atlassian.net/secure/useravatar?size=xsmall&avatarId=10142","32x32":"https://clientname.atlassian.net/secure/useravatar?size=medium&avatarId=10142"},"displayName":"John","active":true,"timeZone":"US"},"status":{"self":"https://clientname.atlassian.net/rest/api/2/status/1","description":"The issue is open and ready for the assignee to start work on it.","iconUrl":"https://clientname.atlassian.net/images/icons/statuses/open.png","name":"Open","id":"1","statusCategory":{"self":"https://clientname.atlassian.net/rest/api/2/statuscategory/2","id":2,"key":"new","colorName":"blue-gray","name":"To Do"}}}}]}

我想要上述 json 字符串的解析器方法来获取这些字段值的特定值,例如:

“摘要”、“状态”、“受让人”、 "cmets", "description", "created", "duedate", "environment", "priority", "project", “reporter”、“resolution”、“issuetype”、“Updated”、“votes”、“components”

我尝试过一个一个。但是,它复杂且耗时。

这就是我正在尝试的方式。但是错误:对象引用未设置为对象的实例。

private List<JiraIssues> GetIssues(SearchResponse response)
{
    List<JiraIssues> returnResulttoReport = new List<JiraIssues>();
    foreach (var item in response.IssueDescriptions) //error here (not sure why IssueDescriptions is NULL but before call i'm de-serializing it)
    {
        foreach (var item1 in item.Comments)
        {

        }
    }

    return returnResulttoReport; 
}

我的返回类型是List&lt;Issuees&gt;。是否有任何库或示例链接可以做到这一点?

请注意,我已经对其进行了反序列化,现在我想要其中的特定列表。另外,请注意,我给出的 JSON 完整字符串与我所拥有的实际不同。但它相似。请指导。

【问题讨论】:

  • 好吧,我会再次使用 JsonConvert,这次反序列化...或使用 LINQ to JSON。关于解析 JSON 的资源有 很多 - 到目前为止您尝试过什么,问题是什么? (您的示例中的 only JSON 数组在 GlossSeeAlso 中并没有帮助 - GlossList 真的不是一个列表......
  • 将此字符串序列化为 JSON,并使用 JSON.net 获取值。见提示:stackoverflow.com/questions/31321513/…
  • 加上json发帖无效。
  • 我已经更新了我的问题,我尝试了什么。另外,我想使用 Newtonsoft,因为我已经在某些方法中使用了它。如果这在newtonsoft中很复杂,那么我会选择另一个。

标签: c# .net json json.net


【解决方案1】:

使用 json2csharp 之类的东西为 json 生成 C# 类,以防止错误。然后做类似的事情

var result = JsonConvert.DeserializeObject<RootObject>(myJsonString);

编辑
以下是如何获取摘要的示例:

RootObject result = JsonConvert.DeserializeObject<RootObject>(json);

List<string> summaries = new List<string>();
foreach (var item in result.issues)
{
    var summary = item.fields.summary;
    Console.WriteLine(summary);
    summaries.Add(summary);
}

RootObject 将代表 JSON 的顶级对象,然后它将具有与 JSON 的每个属性相对应的属性。

【讨论】:

  • 在这里我想得到一些“结果”中非常内部的东西。如何获取?
  • 感谢您的回复。但是,我有“result.issues”= 150。所以它会继续在 foreach 中进行并最后返回给我。但是,我想获得每个项目的摘要。可能我必须返回一个列表(因为我必须返回很多东西,比如摘要)。
  • 更新以显示将它们添加到列表的示例
  • 我正在尝试从“评论”中获取作者姓名:“acahill”和 displayName:“Andrew Cahill”,例如“Console.WriteLine(item.fields.comment.cmets.Comment2.”但是,出现错误,似乎无法识别 Comment2。但是,Comment2 存在于根类中。有什么建议吗?请编辑您的答案。
【解决方案2】:

你可以这样试试:

    public class Issuetype
    {
        public string self { get; set; }
        public string id { get; set; }
        public string description { get; set; }
        public string iconUrl { get; set; }
        public string name { get; set; }
        public bool subtask { get; set; }
    }

    public class AvatarUrls
    {
        public string __invalid_name__48x48 { get; set; }
        public string __invalid_name__24x24 { get; set; }
        public string __invalid_name__16x16 { get; set; }
        public string __invalid_name__32x32 { get; set; }
    }

    public class Project
    {
        public string self { get; set; }
        public string id { get; set; }
        public string key { get; set; }
        public string name { get; set; }
        public AvatarUrls avatarUrls { get; set; }
    }

    public class AvatarUrls2
    {
        public string __invalid_name__48x48 { get; set; }
        public string __invalid_name__24x24 { get; set; }
        public string __invalid_name__16x16 { get; set; }
        public string __invalid_name__32x32 { get; set; }
    }

    public class Reporter
    {
        public string self { get; set; }
        public string name { get; set; }
        public string key { get; set; }
        public string emailAddress { get; set; }
        public AvatarUrls2 avatarUrls { get; set; }
        public string displayName { get; set; }
        public bool active { get; set; }
        public string timeZone { get; set; }
    }

    public class Priority
    {
        public string self { get; set; }
        public string iconUrl { get; set; }
        public string name { get; set; }
        public string id { get; set; }
    }

    public class AvatarUrls3
    {
        public string __invalid_name__48x48 { get; set; }
        public string __invalid_name__24x24 { get; set; }
        public string __invalid_name__16x16 { get; set; }
        public string __invalid_name__32x32 { get; set; }
    }

    public class Author
    {
        public string self { get; set; }
        public string name { get; set; }
        public string key { get; set; }
        public string emailAddress { get; set; }
        public AvatarUrls3 avatarUrls { get; set; }
        public string displayName { get; set; }
        public bool active { get; set; }
        public string timeZone { get; set; }
    }

    public class AvatarUrls4
    {
        public string __invalid_name__48x48 { get; set; }
        public string __invalid_name__24x24 { get; set; }
        public string __invalid_name__16x16 { get; set; }
        public string __invalid_name__32x32 { get; set; }
    }

    public class UpdateAuthor
    {
        public string self { get; set; }
        public string name { get; set; }
        public string key { get; set; }
        public string emailAddress { get; set; }
        public AvatarUrls4 avatarUrls { get; set; }
        public string displayName { get; set; }
        public bool active { get; set; }
        public string timeZone { get; set; }
    }

    public class Comment2
    {
        public string self { get; set; }
        public string id { get; set; }
        public Author author { get; set; }
        public string body { get; set; }
        public UpdateAuthor updateAuthor { get; set; }
        public string created { get; set; }
        public string updated { get; set; }
    }

    public class Comment
    {
        public int startAt { get; set; }
        public int maxResults { get; set; }
        public int total { get; set; }
        public List<Comment2> comments { get; set; }
    }

    public class Votes
    {
        public string self { get; set; }
        public int votes { get; set; }
        public bool hasVoted { get; set; }
    }

    public class AvatarUrls5
    {
        public string __invalid_name__48x48 { get; set; }
        public string __invalid_name__24x24 { get; set; }
        public string __invalid_name__16x16 { get; set; }
        public string __invalid_name__32x32 { get; set; }
    }

    public class Assignee
    {
        public string self { get; set; }
        public string name { get; set; }
        public string key { get; set; }
        public string emailAddress { get; set; }
        public AvatarUrls5 avatarUrls { get; set; }
        public string displayName { get; set; }
        public bool active { get; set; }
        public string timeZone { get; set; }
    }

    public class StatusCategory
    {
        public string self { get; set; }
        public int id { get; set; }
        public string key { get; set; }
        public string colorName { get; set; }
        public string name { get; set; }
    }

    public class Status
    {
        public string self { get; set; }
        public string description { get; set; }
        public string iconUrl { get; set; }
        public string name { get; set; }
        public string id { get; set; }
        public StatusCategory statusCategory { get; set; }
    }

    public class Fields
    {
        public string summary { get; set; }
        public Issuetype issuetype { get; set; }
        public List<object> components { get; set; }
        public string created { get; set; }
        public string description { get; set; }
        public Project project { get; set; }
        public Reporter reporter { get; set; }
        public Priority priority { get; set; }
        public object resolution { get; set; }
        public string duedate { get; set; }
        public Comment comment { get; set; }
        public Votes votes { get; set; }
        public Assignee assignee { get; set; }
        public Status status { get; set; }
    }

    public class Issue
    {
        public string expand { get; set; }
        public string id { get; set; }
        public string self { get; set; }
        public string key { get; set; }
        public Fields fields { get; set; }
    }

    public class RootObject
    {
        public string expand { get; set; }
        public int startAt { get; set; }
        public int maxResults { get; set; }
        public int total { get; set; }
        public List<Issue> issues { get; set; }
    }

var t = JsonConvert.DeserializeObject<RootObject>(json);
var issues = t.issues;

【讨论】:

  • 但在 C# 中反序列化为强类型对象是一种更好的方法。
  • 使用无效键值访问的 JArray 值:“GlossDiv”。预期数组位置索引。
  • 看不到图片。我已将我的 JSON 修改为看起来不错。请您按此修改答案。
  • 在调试期间,当前上下文中不存在其令人满意的“var 问题”。不确定的方式。我的“t”有了结果。
  • issues 只是一个局部变量,怎么在上下文中不存在。我们使用var关键字隐式声明局部变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2018-05-22
相关资源
最近更新 更多