簡體   English   中英

將JSON數據轉換為對象

[英]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添加到您的項目中,這對您來說更容易,您需要了解的所有信息都在這里:

如何使用NuGet安裝JSON.NET?

但是,關於NS JSON的真正好處不是易用性,而是它還可以進行動態反序列化的事實。

如果您不知道接收到的JSON會有什么期望,那么這會派上用場,因此不提前知道如何構造一個對象來保存結果。

您可以在此堆棧溢出文章中找到更多動態地做事的信息,而不是重復其他人說的話:

使用JSon.NET對動態數據反序列化JSON

更新資料

查看您的JSON數據,那里的字段/屬性比試圖解析的要多,並且沒有一個常用的庫(據我所知)將選擇要復制的字段,您要么有一個對象代表他們全部或根本不代表他們,我認為后者是您面臨的問題。

我有一個相當整潔的Chrome JSON插件,而不是給定JSON數據塊格式時,輸出對我來說很好,而且易於閱讀,在定義對象時也大有幫助,使您可以看到完整的嵌套結構在您的數據中,以下是一系列圖像,顯示了使用此插件格式化的JSON數據:

圖片1

圖片2

我不會再粘貼圖像了,但是還會再粘貼4頁!!

現在,一些額外的信息可能會對您有所幫助。

從經驗(我必須為這些Jira webhooks編寫PHP解析器)的經驗中知道,在Jira控制面板中,您可以配置webhooks以僅返回您感興趣的信息。

現在,您似乎已經告訴系統轉​​儲所有內容,對於您也已掛起的每個事件(看起來-全部),距我進行這些工作已經有一段時間了,但是除了全局的Webhook之外,您還具有單獨的Webhook,它們僅在特定事件時觸發,並且生成的JSON數據比您在此處處理的要小得多。

因此,我建議您在Jira控制面板中查看(或要求Admin / Lead Dev / etc查看),並認真整理盡可能多的數據。

此外,如果內存對我來說沒問題,那么您也可以對Jira服務進行各種Web API調用以獲取此信息,在這種情況下,您可以准確告訴API您感興趣的內容,這意味着它只會返回您需要的字段需要。

現在,您的主要問題是您嘗試處理的數據量巨大,如果您解決了這個問題,您會發現嘗試工作的代碼周圍的問題將非常容易處理。

更新2

為了使我更清楚地理解使用“動態”類型獲取數據的含義,可以使用類似以下代碼的內容:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM