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

试图在C#中把一个JSON字符串转换成一个对象。使用一个非常简单的测试案例。

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

问题是routes_list从未被设置,它是一个未定义的对象。有什么想法吗?

解决办法

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

评论(5)

你可能不想把routes_list声明为一个 "对象 "类型。 它没有一个.test属性,所以你真的不会得到一个好的对象。 这是一个你最好定义一个类或一个结构的地方,或者使用动态关键字。

如果你真的想让这段代码按你的要求工作,你需要知道DeserializeObject返回的对象是一个字符串、对象的通用字典。 下面是以这种方式进行的代码。

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

如果你想使用动态关键字,你可以在这里阅读如何使用

如果你声明了一个类或结构,你可以像这样调用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("{ \"test\":\"some data\" }");
        Console.WriteLine(routes_list.test);

        Console.WriteLine("Done...");
        Console.ReadKey(true);
    }
}
评论(3)

这是我从各种帖子中拼凑出来的一个简单类....。它被测试了大约15分钟,但似乎*能满足我的目的。它使用JavascriptSerializer来完成工作,可以在你的应用程序中使用本帖的详细信息来引用。

下面的代码可以在LinqPad中运行,以测试它。

  • 在LinqPad中右键点击你的脚本标签,并选择"查询 属性&quot。
  • 在"附加引用"中引用"System.Web.Extensions.dll&quot。
  • 添加一个"附加命名空间进口"的 "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 jsonData { get; set; }

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

    jsonData = (IDictionary)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)curr[key];
        }
      }
    }
    catch
    {
      // Probably means an invalid path (ie object doesn't exist)
    }

    return result;
  }
}
评论(0)