【问题标题】:Deserialize json to dynamic/anonymous class asp.net将 json 反序列化为动态/匿名类 asp.net
【发布时间】:2015-03-17 14:41:16
【问题描述】:

我有一个名为 ShipFromAddress 的具体类,我在下面这样反序列化我的 json

JavaScriptSerializer jss = new JavaScriptSerializer();
oShipFromAddress = jss.Deserialize<ShipFromAddress>(Request.Cookies["ShipFromAddress"].Value);

具体类

public class ShipFromAddress
{
    public string Weight
    { 
        get; 
        set; 
    }

    public string addressLine1
    {
        get;
        set;
    }

    public string addressLine2
    {
        get;
        set;
    }

    public string city
    {
        get;
        set;
    }

    public string postcode
    {
        get;
        set;
    }

    public string countrycode
    {
        get;
        set;
    }

    public string StateCode
    {
        get;
        set;
    }
}

我不想创建或使用具体类,而是想借助动态对象或匿名类概念即时进行反序列化。请用示例代码指导我。

我有两个解决方案.....看起来不错

1) 当需要将多个数据序列化传递给匿名时,示例将是

var query = from employee in employees select new { Name = employee.Name, Id = employee.Id };
LogEmployees(query);

public void LogEmployees (IEnumerable<dynamic> list)
{
    foreach (dynamic item in list)
    {
        string name = item.Name;
        int id = item.Id;
    }
}

方法参数类型必须是IEnumerable&lt;dynamic&gt; because LogEmployees() 函数需要多个数据

2) 传递单个数据时,代码如下所示

public class Program
{
    private static void Thing(dynamic other)
    {
        Console.WriteLine(other.TheThing);
    }

    private static void Main()
    {
        var things = new { TheThing = "Worked!" };
        Thing(things);
    }
}

【问题讨论】:

标签: c# asp.net json deserialization


【解决方案1】:

使用 JavaScriptSerializer,您可以使用序列化程序中的 DeserializeObject 方法,该方法将只返回一个对象:

JavaScriptSerializer jss = new JavaScriptSerializer();
object obj= jss.DeserializeObject(Request.Cookies["ShipFromAddress"].Value);

在内部它将表示为Dictionary&lt;string, object&gt;,因此您可以将其转换为它并像这样使用:

var values = (Dictionary<string, object>)jss.DeserializeObject(Request.Cookies["ShipFromAddress"].Value);
var addressLine1 = values["addressLine1"].ToString();

或者您可以将其转换为dynamic

dynamic values = jss.DeserializeObject(Request.Cookies["ShipFromAddress"].Value);
var addressLine1 = values["addressLine1"].ToString();

或者,您可以使用Json.NET 库,它是JsonConvert 类(基准测试表明它比JavaScriptSerializer 执行得更快)。代码将如下所示:

dynamic values = JsonConvert.DeserializeObject(Request.Cookies["ShipFromAddress"].Value);
var addressLine1 = values.addressLine1;

【讨论】:

  • 我认为 OP 想要一个强类型对象。
  • 您可能想将obj 声明为动态的,这在这里更有用,而且通常JavaScriptSerializer 是个坏主意 - 使用来自 Json.NET 的JsonConvert - 这样更快且错误更少.
  • @EamonNerbonne 添加了关于 Json.NET 的注释
  • @YuvalItzchakov OP 声明他想将对象反序列化为动态结构,而不是具体的类
  • 动态为dynamic 类型?
【解决方案2】:

我使用 Newtonsoft.Json

string source = Request.Cookies["ShipFromAddress"].Value as string;

var address = JsonConvert.DeserializeObject<ShipFromAddress>(source);

【讨论】:

  • address1,address2,city, postcode 等都将存储在地址变量中吗?我们可以像 address.addressLine1 或 address.City 一样访问吗?
  • 您可以像 ShipFromAddress address.City、address.addressLine1 等类的对象一样访问它
猜你喜欢
  • 2012-08-05
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多