将 JSON 字符串转换为 C# 对象

Posted

技术标签:

【中文标题】将 JSON 字符串转换为 C# 对象【英文标题】:Convert JSON String To C# Object 【发布时间】:2011-06-04 09:44:26 【问题描述】:

尝试将 JSON 字符串转换为 C# 中的对象。使用一个非常简单的测试用例:

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

问题是 routes_list 永远不会被设置;这是一个未定义的对象。有什么想法吗?

【问题讨论】:

@Greg:我实际上推荐JavaScriptSerializer而不是MS的版本,因为它除了WCF的自定义JSON格式之外不接受任何其他内容(例如,日期字段看起来像日期但不包含在DATE中( ) 惨败) 另外,看看这篇Parsing JSON objects with JavascriptSerializer in .NET的文章,其实是一个很棒的教程。 你从哪里获得 JavaScriptSerializer?它在我的 C# .NET 3.5 项目中无法识别。 @B. Clay Shannon 这为我解决了***.com/questions/7000811/… 您可以毫无问题地使用JavaScriptSerializer 。我将在下面提供答案。 【参考方案1】:

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

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

T 是与 JSON 字符串匹配的对象类型。

【讨论】:

这很简单,我想了很长时间。 您最终创建的“T”类型类可以是部分的,不需要是包含每个 JSON 属性的完整响应的精确副本。尽管层次结构需要匹配,但您可以准确地反序列化您需要的内容。【参考方案2】:

看起来您正试图反序列化为原始对象。您可以创建一个代表您要转换为的对象的类。这在您处理较大的对象或 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

【讨论】:

但在有针对性的文章中使用了自动属性。也值得一提。 抱歉,此代码示例不起作用。 DeserializeObject 给出了一个例外。使用 var routes_list = serializer.Deserialize("\"test\":\"some data\"");反而。此外,您不需要 get/setTest(),并且字符串测试应该是公开的。这看起来更像 java 而不是 C#。 正如 Dan Vallejo 所说,这是一个不正确的解决方案。毕竟 setTest(String test) 没有返回,这也是编译错误。 也可以这样用:json_serializer.Deserialize(" \"test\":\"some data\" "); //而不是(测试)json_serializer..... 如果你不确定你的类对象的格式,试试这个link。它将您的 Json 字符串转换为正确的类。为我节省了大量时间!【参考方案3】:

您可能不想只将 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"]);

如果你想使用动态关键字,you can read how here。

如果你声明一个类或结构,你可以像这样调用 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);
    

【讨论】:

做:json_serializer = new JavaScriptSerializer(); object routes_list = (IDictionary)json_serializer.DeserializeObject(" \"test\":\"some data here\" ");在当前上下文中仍然不存在“routes_list”。 不要使用object routes_list。使用 var 或明确重复自己并将 routes_list 声明为 IDictionary.【参考方案4】:

在 JavaScriptSerializer 中使用动态对象。

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

//test Result = "some data"

【讨论】:

【参考方案5】:

Newtonsoft 比 java 脚本序列化器更快。 ...这个依赖于 Newtonsoft NuGet 包,它比默认的序列化程序更受欢迎并且更好。

一行代码解决方案。

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

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

【讨论】:

【参考方案6】:

您可以使用 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 的一种非常简单的方法。

【讨论】:

【参考方案7】:

这是一个简单的课程,我从不同的帖子中拼凑起来......它已经测试了大约 15 分钟,但 似乎 可以满足我的目的。它使用JavascriptSerializer 来完成这项工作,可以使用详细信息in this post 在您的应用中引用。

以下代码可以在 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;
  

【讨论】:

【参考方案8】:

正如tripletdad99所说的

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

但如果您不想创建额外的对象,您可以使用 Dictionary 代替

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

【讨论】:

这很有用,然后你将参数传递给 Url.Action(action,controller,result)【参考方案9】:

添加此 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);

【讨论】:

【参考方案10】:

复制您的 Json 并粘贴到 json2csharp 的文本框中,然后单击“生成”按钮。

一个 cs 类将使用该 cs 文件生成如下

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

其中RootObject是生成的cs文件的名称;

【讨论】:

【参考方案11】:

半自动化这些步骤的另一种快速简便的方法是:

    获取您要解析的 JSON 并将其粘贴到此处:https://app.quicktype.io/。在下拉菜单中将语言更改为 C#。 将左上角的名称更新为您的班级名称,默认为“欢迎”。 在 Visual Studio 中,转到网站 -> 管理包并使用 NuGet 从 Newtonsoft 添加 Json.Net。

    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);

【讨论】:

链接不再有效 感谢 Myles J,我更新到了一个似乎可以正常工作的新网站。【参考方案12】:

在 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);

【讨论】:

需要 Newtonsoft.Json.dll / 参考,同意吗?【参考方案13】:

首先你必须包含如下库:

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);

【讨论】:

【参考方案14】:

假设你有一个类名Student,它有以下字段,它有一个方法可以将 JSON 作为输入并返回一个字符串Student Object。我们可以在这里使用JavaScriptSerializer Convert JSON String To C# Object .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);
 

【讨论】:

以上是关于将 JSON 字符串转换为 C# 对象的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 字符串转换为 JSON 对象 c#

将 C# 对象转换为 JSON 或 Javascript 对象

将 C# 对象转换为 Json 对象

在C#中将对象转换为JSON字符串[重复]

C# JSON 将文件反序列化为对象列表失败,并将字符串转换为集合错误

如何将 c# 二维数组转换为 JSON 对象?