我对此很陌生。如果我犯了任何错误,请原谅我。
我有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);
答案 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数据的图像:
我不打算再粘贴图片了,但这又是4页!!
现在,一些可能对您有帮助的额外信息。
我从经验中知道(我必须在PHP中为这些Jira webhooks编写一个解析器),在Jira控制面板中,您可以将您的webhook配置为仅返回您感兴趣的信息。
现在,看起来你刚刚告诉系统要丢弃所有内容,对于你所挂钩的每一个事件(看起来都像 - 所有这些),它都是一个虽然我做了这些工作,但是除了全球webhook之外,你还有个别的webhooks,它只针对特定的事件并产生比你在这里处理的JSON数据小得多的JSON数据。
因此,我建议您查看您的Jira控制面板(或者请您的管理员/潜在客户开发人员等查看)并尽可能地减少尽可能多的数据。< / p>
此外,如果内存对我有用,您也可以对Jira服务进行各种Web API调用以获取此信息,在这种情况下,您可以准确地告诉API您感兴趣的内容,这意味着它只会返回你需要的领域。
目前,您的主要问题是您尝试处理的数据量庞大,如果您解决了这个问题,您会发现围绕代码的问题,您尝试开始工作将更容易处理用。
通过使用&#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);