簡體   English   中英

將 JSON 字符串轉換為 C# 對象

[英]Convert JSON String To C# Object

嘗試將 JSON 字符串轉換為 C# 中的對象。 使用一個非常簡單的測試用例:

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

問題是 routes_list 永遠不會被設置; 它是一個未定義的對象。 有什么想法嗎?

或者,您可以使用 Newtownsoft.Json 庫,如下所示:

using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);

其中T是與 JSON 字符串匹配的對象類型。

看起來您正在嘗試反序列化為原始對象。 您可以創建一個代表您要轉換到的對象的類。 這在您處理較大對象或 JSON 字符串的情況下最有用。

例如:

  class Test {

      String test; 

      String getTest() { return test; }
      void setTest(String test) { this.test = test; }

  }

那么你的反序列化代碼將是:

   JavaScriptSerializer json_serializer = new JavaScriptSerializer();
   Test routes_list = 
          (Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

更多信息可以在本教程中找到: http : //www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx

您可能不想僅僅將 routes_list 聲明為object類型。 它沒有 .test 屬性,所以你真的不會得到一個好的對象。 這是您最好定義類或結構或使用 dynamic 關鍵字的地方之一。

如果你真的想讓這段代碼像你擁有的那樣工作,你需要知道 DeserializeObject 返回的對象是一個字符串,對象的通用字典。 這是這樣做的代碼:

var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);

如果你想使用 dynamic 關鍵字, 你可以在這里閱讀如何

如果你聲明一個類或結構,你可以像這樣調用 Deserialize 而不是 DeserializeObject:

class MyProgram {
    struct MyObj {
        public string test { get; set; }
    }

    static void Main(string[] args) {
        var json_serializer = new JavaScriptSerializer();
        MyObj routes_list = json_serializer.Deserialize<MyObj>("{ \"test\":\"some data\" }");
        Console.WriteLine(routes_list.test);

        Console.WriteLine("Done...");
        Console.ReadKey(true);
    }
}

在 JavaScriptSerializer 中使用動態對象。

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];

//test Result = "some data"

Newtonsoft 比 java 腳本序列化器快。 ...這個依賴於 Newtonsoft NuGet 包,它很流行並且比默認的序列化器更好。

一行代碼解決方案。

var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);

您可以使用 Newtonsoft.Json 庫輕松完成您的要求。 我正在寫下下面的一個例子,看看它。

您收到的對象類型的類:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }

}

代碼:

static void Main(string[] args)
{

      string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}";

      User user = JsonConvert.DeserializeObject<User>(json);

      Console.ReadKey();
}

這是解析 json 的一種非常簡單的方法。

這是我從各種帖子拼湊而成的一個簡單課程......它已經測試了大約 15 分鍾,但似乎對我的目的有效。 它使用JavascriptSerializer來完成這項工作,可以使用這篇文章中詳述的信息在您的應用程序中引用。

下面的代碼可以在 LinqPad 中運行以通過以下方式進行測試:

  • 右鍵單擊 LinqPad 中的腳本選項卡,然后選擇“查詢屬性”
  • 在“其他參考”中引用“System.Web.Extensions.dll”
  • 添加“System.Web.Script.Serialization”的“附加命名空間導入”。

希望有幫助!

void Main()
{
  string json = @"
  {
    'glossary': 
    {
      'title': 'example glossary',
        'GlossDiv': 
        {
          'title': 'S',
          'GlossList': 
          {
            'GlossEntry': 
            {
              'ID': 'SGML',
              'ItemNumber': 2,          
              'SortAs': 'SGML',
              'GlossTerm': 'Standard Generalized Markup Language',
              'Acronym': 'SGML',
              'Abbrev': 'ISO 8879:1986',
              'GlossDef': 
              {
                'para': 'A meta-markup language, used to create markup languages such as DocBook.',
                'GlossSeeAlso': ['GML', 'XML']
              },
              'GlossSee': 'markup'
            }
          }
        }
    }
  }

  ";

  var d = new JsonDeserializer(json);
  d.GetString("glossary.title").Dump();
  d.GetString("glossary.GlossDiv.title").Dump();  
  d.GetString("glossary.GlossDiv.GlossList.GlossEntry.ID").Dump();  
  d.GetInt("glossary.GlossDiv.GlossList.GlossEntry.ItemNumber").Dump();    
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef").Dump();   
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso").Dump(); 
  d.GetObject("Some Path That Doesnt Exist.Or.Another").Dump();   
}


// Define other methods and classes here

public class JsonDeserializer
{
  private IDictionary<string, object> jsonData { get; set; }

  public JsonDeserializer(string json)
  {
    var json_serializer = new JavaScriptSerializer();

    jsonData = (IDictionary<string, object>)json_serializer.DeserializeObject(json);
  }

  public string GetString(string path)
  {
    return (string) GetObject(path);
  }

  public int? GetInt(string path)
  {
    int? result = null;

    object o = GetObject(path);
    if (o == null)
    {
      return result;
    }

    if (o is string)
    {
      result = Int32.Parse((string)o);
    }
    else
    {
      result = (Int32) o;
    }

    return result;
  }

  public object GetObject(string path)
  {
    object result = null;

    var curr = jsonData;
    var paths = path.Split('.');
    var pathCount = paths.Count();

    try
    {
      for (int i = 0; i < pathCount; i++)
      {
        var key = paths[i];
        if (i == (pathCount - 1))
        {
          result = curr[key];
        }
        else
        {
          curr = (IDictionary<string, object>)curr[key];
        }
      }
    }
    catch
    {
      // Probably means an invalid path (ie object doesn't exist)
    }

    return result;
  }
}

正如tripletdad99所說

var result = JsonConvert.DeserializeObject<T>(json);

但是如果你不想創建一個額外的對象,你可以用Dictionary來代替

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);

添加此 ddl 以引用您的項目: System.Web.Extensions.dll

使用這個命名空間: using System.Web.Script.Serialization;

public class IdName
{
    public int Id { get; set; }
    public string Name { get; set; }
}


   string jsonStringSingle = "{'Id': 1, 'Name':'Thulasi Ram.S'}".Replace("'", "\"");
   var entity = new JavaScriptSerializer().Deserialize<IdName>(jsonStringSingle);

   string jsonStringCollection = "[{'Id': 2, 'Name':'Thulasi Ram.S'},{'Id': 2, 'Name':'Raja Ram.S'},{'Id': 3, 'Name':'Ram.S'}]".Replace("'", "\"");
   var collection = new JavaScriptSerializer().Deserialize<IEnumerable<IdName>>(jsonStringCollection);

使這些步驟半自動化的另一種快速簡便的方法是:

  1. 獲取您要解析的 JSON 並將其粘貼到此處: https : //app.quicktype.io/ 在下拉列表中將語言更改為 C#。
  2. 將左上角的名稱更新為您的班級名稱,默認為“歡迎”。
  3. 在 Visual Studio 中,轉到網站 -> 管理包並使用 NuGet 從 Newtonsoft 添加 Json.Net。
  4. app.quicktype.io 基於 Newtonsoft 生成序列化方法。 或者,您現在可以使用以下代碼:

    WebClient 客戶端 = new WebClient();

    string myJSON = client.DownloadString(" https://URL_FOR_JSON.com/JSON_STUFF ");

    var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON);

復制您的 Json 並粘貼到json2csharp上的文本框,然后單擊“生成”按鈕。

將使用該 cs 文件生成一個cs類,如下所示

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

其中RootObject為生成的cs文件名;

在 C# 中將 JSON 字符串轉換為對象。 使用下面的測試用例..它對我有用。 這里“ MenuInfo ”是我的 C# 類對象。

JsonTextReader reader = null;
try
{
    WebClient webClient = new WebClient();
    JObject result = JObject.Parse(webClient.DownloadString("YOUR URL"));
    reader = new JsonTextReader(new System.IO.StringReader(result.ToString()));
    reader.SupportMultipleContent = true;
}
catch(Exception)
{}

JsonSerializer serializer = new JsonSerializer();
MenuInfo menuInfo = serializer.Deserialize<MenuInfo>(reader);

首先,您必須包含以下庫:

using System.Runtime.Serialization.Json;

DataContractJsonSerializer desc = new DataContractJsonSerializer(typeof(BlogSite));
string json = "{\"Description\":\"Share knowledge\",\"Name\":\"zahid\"}";

using (var ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(json)))
{
    BlogSite b = (BlogSite)desc.ReadObject(ms);
    Console.WriteLine(b.Name);
    Console.WriteLine(b.Description);
}

假設你有一個類名Student它有以下字段,它有一個方法,它將 JSON 作為輸入並返回一個字符串Student Object 。我們可以在這里使用JavaScriptSerializer將 JSON 字符串轉換為 C# 對象。 std是這里的 JSON 字符串。

  public class Student
{
   public string FirstName {get;set:}
   public string LastName {get;set:}
   public int[] Grades {get;set:}
}

public static Student ConvertToStudent(string std)
{
  var serializer = new JavaScriptSerializer();

  Return serializer.Deserialize<Student>(std);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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