【问题标题】:How to convert json object to custom type before deserializing?如何在反序列化之前将 json 对象转换为自定义类型?
【发布时间】:2011-08-08 07:44:13
【问题描述】:

我有一堂课:

public class LineItemWithDetails
{
        public LineItem LineItem { get; set; }
        public object Details { get; set; }

}

还有一个webservice方法,它接受一个从javascript传入的json对象,并反序列化它:

[WebMethod(true)]
public string SaveLineItemDetails(object details, int categoryId, int lineItemId)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    LineItemWithDetails lineItem = serializer.Deserialize<LineItemWithDetails>(details.ToString());

}

参数“details”,如下所示: details.Details["Name"] = "tessa"; details.Details["PositionTitle"] = "随便";

我的问题是,我希望在反序列化之前将 LineItemDetails 类中的 Details 属性转换为 BudgetPersonnel(见下文),以便将来自 json 对象的值分配给 BudgetPersonnel 属性。 BudgetPersonnel 只是一种类型的示例,还有其他几种。转换成哪个是由 webservice 方法中的 categoryId 参数决定的。我已经阅读了很多关于泛型铸造的教程,并且它们很有效。但是,我不明白如何在反序列化之前实现这一点。上面 SaveLineItemDetails 中列出的代码是反序列化的,但是 Details 属性显然只是一个对象,而不是 BudgetPersonnel 类型的。

例子:

public BudgetPersonnel(string name, string positionTitle)
{
    this.Name = name;
    this.PositionTitle = positionTitle;
}

【问题讨论】:

    标签: c# json


    【解决方案1】:

    首先,我不太确定我能解决你的问题,所以这是我的答案。

    那么你想要的基本上是将一些 JSON 反序列化为 BudgetPersonnel 对象? 当我为学校做一个涉及调用服务器的作业并且服务器返回一个 JSON 字符串时,我遇到了类似的问题。只要 JSON 字符串包含以下内容,我就使用了一个序列化各种对象的库:

    "class":"MyClass"
    

    我猜这是要你吗?将 JSON 字符串转换为具有指定值的某个对象?我建议使用现有的库来做到这一点(例如Json.NET) 只需传递一个看起来像这样的 JSON 字符串:

    ["Name":"tessa" , "PositionTitle":"superman"]
    

    如果我正确理解您的问题,希望对您有所帮助。

    【讨论】:

    • 感谢您的回答!我认为我的问题更多是试图弄清楚如何在反序列化之前将 LineItemDetails 中的 Details 参数转换或转换为我的自定义类型。 BudgetPersonnel 只是我拥有的几种类型中的一种,它们作为 categoryId 传递给 webservice 方法。我稍微更新了我的问题,希望能更清楚。
    • 如何投射一个没有反序列化的对象?一种解决方案是将 JSON 字符串反序列化为“最适合”的类型,然后执行强制转换。正如我在回答中所建议的那样,编写自己的反序列化代码会更高效且不易出错。
    【解决方案2】:

    您需要编写自己的反序列化类来实现抽象基类 JavaScriptConverter。

    取自 MSDN:

    serializer = new JavaScriptSerializer();
    
    // Register the custom converter.
    serializer.RegisterConverters(new JavaScriptConverter[] { 
        new System.Web.Script.Serialization.CS.ListItemCollectionConverter() });
    

    http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.registerconverters.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多