将JSON数据转换为对象

时间:2015-05-07 10:28:46

标签: c# json

我对此很陌生。如果我犯了任何错误,请原谅我。

我有JSON格式的数据。我可以直接读取这些数据并在C#代码中使用它吗?

根据我在互联网上阅读的理解,我认为我必须将其转换为使用数据的对象形式。我是对的吗?

如果是,那么我看到这种方法转换如下:

string data = JsonConvert.DeserializeObject<string>(getmyissue());

getmyissue是一个函数,它返回一个包含json格式数据的字符串。

这给了我一个例外

  

&#34;读取string.Unexpected Token时出错。&#34;

有人可以指导我哪里出错了吗?

修改

MyIssue.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Example
{
    public class MyIssue
    {
        public string name{get;set;}
        public string description { get; set; }
        public string created { get;set; }
        public string updated{get;set;}
        public string displayName { get; set; }

    }
}

Program.cs的

MyIssue obj=null;
        try
        {             
            obj = JsonConvert.DeserializeObject<MyIssue>(manager.getmyissue());
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
        }

        Console.WriteLine("Name:  "+obj.name);

2 个答案:

答案 0 :(得分:3)

在C#/ .NET程序中对Json进行反序列化的最简单方法是使用辉煌的NewtonSoft JSON库。

有很多方法可以做到这一点,但我不得不承认NS库只是继续完成任务(而不是我不是团队的成员等,只是一个Avid用户: - ))。

要做你想做的事,例如,如果你有:

{'Name': 'A person', 'AllowAccess': true,'Areas': ['Sales','Admin']}

您首先要构建一个对象来表示它,如下所示:

public MyObject
{
  public string Name { get; set; }
  public bool AllowAccess { get; set; }
  public List<string> Areas { get; set; }
}

完成此操作后,只需执行以下操作即可:

string jsonString = "// Your json formated string data goes here";
MyObject myObject = JsonConvert.DeserializeObject<MyObject>(jsonString);

此时对象中的属性应反映您发送给它的JSON数据中的属性。

您当然需要通过NuGet或Manually将NS JSON Libs添加到您的项目中,这对您来说更容易,您需要了解的所有内容都在这里:

How to install JSON.NET using NuGet?

然而,NS JSON真正的优点不在于易用性,而在于它还可以进行动态反序列化。

如果您不知道在收到的JSON中会发生什么,这就派上用场了,所以不要提前知道如何构建一个对象来保存结果。

不是重复别人说过的话,你可以在这个堆栈溢出帖子中找到更多关于动态做事的信息:

Deserializing JSON using JSon.NET with dynamic data

更新

查看您的JSON数据,您有更多的字段/属性,而不是您尝试解析,并且没有一个常用的库(据我所知)将挑选并选择要复制的字段,您要么有一个对象代表他们所有人,或根本不代表他们,后者我认为这是你面临的问题。

我有一个相当整洁的&#34; JSON&#34;插入用于chrome,比给出一大块JSON数据格式的输出对我来说很好并且易于阅读,它还有助于大量定义对象,允许您查看数据的完整嵌套结构,这里是一个系列显示使用此插件格式化的JSON数据的图像:

Image 1

Image 2

我不打算再粘贴图片了,但这又是4页!!

现在,一些可能对您有帮助的额外信息。

我从经验中知道(我必须在PHP中为这些Jira webhooks编写一个解析器),在Jira控制面板中,您可以将您的webhook配置为仅返回您感兴趣的信息。

现在,看起来你刚刚告诉系统要丢弃所有内容,对于你所挂钩的每一个事件(看起来都像 - 所有这些),它都是一个虽然我做了这些工作,但是除了全球webhook之外,你还有个别的webhooks,它只针对特定的事件并产生比你在这里处理的JSON数据小得多的JSON数据。

因此,我建议您查看您的Jira控制面板(或者请您的管理员/潜在客户开发人员等查看)并尽可能地减少尽可能多的数据。< / p>

此外,如果内存对我有用,您也可以对Jira服务进行各种Web API调用以获取此信息,在这种情况下,您可以准确地告诉API您感兴趣的内容,这意味着它只会返回你需要的领域。

目前,您的主要问题是您尝试处理的数据量庞大,如果您解决了这个问题,您会发现围绕代码的问题,您尝试开始工作将更容易处理用。

更新2

通过使用&#34;动态&#34;更清楚我的意思键入以获取数据,您将使用类似下面的代码:

string jsonString = "// Your json formated string data goes here";
var result = JsonConvert.DeserializeObject<dynamic>(jsonString);

这里的区别在于您使用C#动态类型而不是您自己设计的强类型对象。

&#34;动态&#34;是有用的,因为它有点像一个空对象,然后为你添加属性,而不必定义它。

这实际上意味着,如果你传入以下JSON:

{'Name': 'A person', 'AllowAccess': true,'Areas': ['Sales','Admin']}

你最终得到的动态对象如下:

result = dynamic
{
  public string Name { get; set; }
  public bool AllowAccess { get; set; }
  public List<string> Areas { get; set; }
}

因此:

result.Name 

将允许您访问“名称”字段的内容,依此类推。

如果您的JSON随后更改为:

{'Name': 'A person', 'AllowAccess': true,'Areas': ['Sales','Admin'], 'Location': 'The World' }

您的对象会神奇地拥有一个名为“位置”的属性。包含价值&#39;世界&#39;您可以使用以下方式访问:

result.Location

在您的情况下,这将允许您定义具体对象EG:

public MyObject
{
  public string Name { get; set; }
  public string Email { get; set; }
}

然后执行以下操作(假设您的入站JSON具有名为&amp; Email的属性):

string jsonString = "// Your json formated string data goes here";
var result = JsonConvert.DeserializeObject<dynamic>(jsonString);
MyObject myObject = new MyObject
{
  Name = result.Name,
  Email = result.Email
}

然后您丢弃动态对象,因为您不再需要它了。

使用此方法您将遇到的 BIG 问题是维护您的模型。手动属性分配对于少数几个属性和对象来说都很好,但随着软件的增长,很快就会成为一个巨大的维护噩梦。

我确定如果您必须针对100种不同的JSON请求和50种不同类型的对象执行此操作,那么您将面临什么样的任务并不会花费太多时间

出于这个原因,使用这种方法你应该考虑使用某种映射技术,例如&#34; AutoMapper&#34;但是现在我建议你把它留到开始之前研究它,因为它不能帮助你明确处理这种动态方法。

答案 1 :(得分:0)

您获得的JSON已经是一个字符串,因此将其转换为字符串并没有多大意义。您需要创建反映JSON字符串表示的结构的类。

例如,要将以下JSON转换为对象,您必须为用户创建一个类:

{"user":{"name":"asdf","teamname":"b","email":"c","players":["1","2"]}}

public class User
{
    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}

然后你应该能够使用它:

JavaScriptSerializer jss= new JavaScriptSerializer(); 
List<User> users = jss.Deserialize<List<User>>(jsonResponse);