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


183

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

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

问题是无法设置routes_list。这是一个未定义的对象。有任何想法吗?


1
@Greg:我实际上推荐JavaScriptSerializerover MS的版本,因为它除了WCF的自定义JSON格式之外将不接受其他任何格式(例如,看起来像日期但没有被DATE()包围的日期字段失败了)
Brad Christie

另外,请参阅.NET中有关使用JavascriptSerializer解析JSON对象的文章,这实际上是一个很棒的教程。
scatmoi 2012年

您在哪里获得JavaScriptSerializer?在我的C#.NET 3.5项目中无法识别。
B. Clay Shannon

1
@B。克莱香这解决了这对我stackoverflow.com/questions/7000811/...
Fuzzybear

Answers:


127

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


1
但是在尖锐的文章中使用了自动属性。也值得一提。
伊万·科胡金

11
抱歉,此代码示例不起作用。DeserializeObject给出一个异常。使用var route_list = serializer.Deserialize <Test>(“ {\” test \“:\”一些数据\“}”); 代替。另外,您不需要get / setTest(),并且String测试应该是公共的。与C#相比,它看起来更像Java。
dvallejo

正如Dan Vallejo所说,这是一个错误的解决方案。毕竟,setTest(String test)没有返回,这也是编译错误。
Payam

1
也可以使用以下命令:json_serializer.Deserialize <Test>(“ {\” test \“:\” some data \“}”); //代替(Test)json_serializer .....
Bashar Abu Shamaa 2015年

1
如果您不确定类对象的格式,请尝试使用此链接。它将您的Json字符串转换为正确的类。节省了我很多时间!
jade290 '16

231

或者,您可以按以下方式使用Newtownsoft.Json库:

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

T与JSON字符串匹配的对象类型在哪里。


3
这很容易,我想了很久才知道如何做到这一点。
maracuja-juice

58

您可能不想只将route_list声明为object类型。它没有.test属性,因此您真的不会找回漂亮的对象。这是您最好定义类或结构或使用dynamic关键字的地方之一。

如果您确实希望此代码按原样工作,则需要知道DeserializeObject返回的对象是string,object的通用字典。这是这样做的代码:

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

这样做:json_serializer = new JavaScriptSerializer(); 对象routes_list =(IDictionary <字符串,对象>)json_serializer.DeserializeObject(“ {\” test \“:\”此处有一些数据\“}”);在当前上下文中仍不存在“ routes_list”。
贾斯汀

1
不要使用object routes_list。使用var或明确地重复您自己,并将route_list声明为IDictionary <string,object>。
mattmc3 2011年

31

在JavaScriptSerializer中使用动态对象。

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

//test Result = "some data"

19

Newtonsoft比Java脚本序列化器更快。...这取决于Newtonsoft NuGet软件包,该软件包非常流行,并且比默认的序列化程序更好。

一线代码解决方案。

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

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

15

这是一个简单的课程,我从各种各样的帖子中凑了一下。。。它已经测试了约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;
  }
}

14

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


11

正如Tripletdad99所说

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

但是,如果你不希望创建一个额外的对象,你可以让它Dictionary代替

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

这很有用,然后将参数传递给Url.Action(action,controller,result)
Lapenkov Vladimir

8

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

使用此命名空间:使用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);

6

复制您的Json并粘贴到json2csharp上的文本框中,然后单击Generate按钮。

将使用以下cs文件生成一个cs

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

RootObject生成的cs文件的名称在哪里;


4

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

  1. 提取要解析的JSON并将其粘贴到此处:https : //app.quicktype.io/。在下拉菜单中将语言更改为C#。
  2. 将左上角的名称更新为您的班级名称,默认为“ Welcome”。
  3. 在visual studio中,转到网站->管理软件包,然后使用NuGet从Newtonsoft添加Json.Net。
  4. app.quicktype.io基于Newtonsoft生成了序列化方法。或者,您现在可以使用如下代码:

    WebClient客户端=新的WebClient();

    字符串myJSON = client.DownloadString(“ https://URL_FOR_JSON.com/JSON_STUFF ”);

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


链接不再有效
Myles J

谢谢Myles J,我更新到了一个看上去不错的新站点。
杰森·希金斯

0

将JSON字符串转换为C#中的对象。使用下面的测试用例..它为我工作。这里的“ 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);

0

首先,您必须包括如下库:

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.