[英]Converting JSON data into an object
我對此很陌生,如果我有任何錯誤請原諒。
我有JSON格式的數據。我可以直接讀取此數據並在C#代碼中使用它嗎?
根據我在互聯網上的閱讀了解,我認為我必須將其轉換為對象形式才能使用數據。對嗎?
如果是,那么我看到此方法轉換如下:
string data = JsonConvert.DeserializeObject<string>(getmyissue());
getmyissue是返回具有json格式數據的字符串的函數。
這給了我一個例外的說法
“讀取字符串時出錯。意外的令牌。”
有人可以引導我我去哪里了嗎?
編輯
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);
在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添加到您的項目中,這對您來說更容易,您需要了解的所有信息都在這里:
但是,關於NS JSON的真正好處不是易用性,而是它還可以進行動態反序列化的事實。
如果您不知道接收到的JSON會有什么期望,那么這會派上用場,因此不提前知道如何構造一個對象來保存結果。
您可以在此堆棧溢出文章中找到更多動態地做事的信息,而不是重復其他人說的話:
查看您的JSON數據,那里的字段/屬性比試圖解析的要多,並且沒有一個常用的庫(據我所知)將選擇要復制的字段,您要么有一個對象代表他們全部或根本不代表他們,我認為后者是您面臨的問題。
我有一個相當整潔的Chrome JSON插件,而不是給定JSON數據塊格式時,輸出對我來說很好,而且易於閱讀,在定義對象時也大有幫助,使您可以看到完整的嵌套結構在您的數據中,以下是一系列圖像,顯示了使用此插件格式化的JSON數據:
我不會再粘貼圖像了,但是還會再粘貼4頁!!
現在,一些額外的信息可能會對您有所幫助。
從經驗(我必須為這些Jira webhooks編寫PHP解析器)的經驗中知道,在Jira控制面板中,您可以配置webhooks以僅返回您感興趣的信息。
現在,您似乎已經告訴系統轉儲所有內容,對於您也已掛起的每個事件(看起來-全部),距我進行這些工作已經有一段時間了,但是除了全局的Webhook之外,您還具有單獨的Webhook,它們僅在特定事件時觸發,並且生成的JSON數據比您在此處處理的要小得多。
因此,我建議您在Jira控制面板中查看(或要求Admin / Lead Dev / etc查看),並認真整理盡可能多的數據。
此外,如果內存對我來說沒問題,那么您也可以對Jira服務進行各種Web API調用以獲取此信息,在這種情況下,您可以准確告訴API您感興趣的內容,這意味着它只會返回您需要的字段需要。
現在,您的主要問題是您嘗試處理的數據量巨大,如果您解決了這個問題,您會發現嘗試工作的代碼周圍的問題將非常容易處理。
為了使我更清楚地理解使用“動態”類型獲取數據的含義,可以使用類似以下代碼的內容:
string jsonString = "// Your json formated string data goes here";
var result = JsonConvert.DeserializeObject<dynamic>(jsonString);
此處的區別在於您使用的是C#動態類型,而不是您自己設計的強類型對象。
“動態”很有用,因為它就像有一個空對象,然后為您添加了屬性,而無需定義它。
這實質上意味着,如果您傳遞以下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' }
您的對象將神奇地具有一個名為“ Location”的屬性,其中包含值“ The World”,您可以使用以下方式訪問該屬性:
result.Location
在您的情況下,這將允許您定義具體對象EG:
public MyObject
{
public string Name { get; set; }
public string Email { get; set; }
}
然后執行以下操作(假設您的入站JSON在“名稱和電子郵件”中具有屬性):
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種不同類型的對象執行此任務,那么可以想象您將要面對什么樣的任務。
因此,使用這種方法時,您應該真正考慮使用諸如“ AutoMapper”之類的映射技術,但是現在我建議您在開始研究之前將其保留,直到稍后為止,因為它對您沒有幫助。要明確處理這種動態方法。
您獲得的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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.