servicestack-text,Json,Serialization,servicestack Text" /> servicestack-text,Json,Serialization,servicestack Text" />

ServiceSatck JSON序列化

ServiceSatck JSON序列化,json,serialization,servicestack-text,Json,Serialization,servicestack Text,我使用ServiceStack nuget包进行JSON序列化/反序列化,因为它比Newtonsoft快。我有一个数据结构,其中包含一些属性,这些属性是自定义对象的列表,下面是我的类 public class MainBO { public IList<BasketItem> Items{get;set;} } public class BasketItem { public int BasketItemId { get; set; } public str

我使用ServiceStack nuget包进行JSON序列化/反序列化,因为它比Newtonsoft快。我有一个数据结构,其中包含一些属性,这些属性是自定义对象的列表,下面是我的类

public class MainBO
{
  public IList<BasketItem> Items{get;set;}
}

 public class BasketItem
{
    public int BasketItemId { get; set; }

    public string ItemId { get; set; }

    public string Upc { get; set; }

    public string Description { get; set; }

    public string Name { get; set; }

    public Decimal OrginalPrice { get; set; }

    public Decimal CurrentPrice { get; set; }
    public IList<Decimal> OfferPrice { get; set; }
    public Decimal ShippingCost { get; set; }

    public Decimal DeliveryCharge { get; set; }
    public string ReceiptMessage { get; set; }
    public int Quantity { get; set; }

    public bool? Discountable { get; set; }

    public bool? Taxable { get; set; }

    public bool IsPriceOveriddedItem { get; set; }

    public string Taxcode { get; set; }

    public string PriceOverrideReason { get; set; }

    public string TaxOverrideReason { get; set; }

    public int OriginalQuantity { get; set; }

    public int RemainingQuantity { get; set; }
    public IList<string> Hierarchy { get; set; }

    public IList<LineDiscountBO> AppliedDiscounts { get; set; }

    public IList<LineTaxBO> AppliedTaxes { get; set; }

    public BasketItemStatus Status { get; set; }

    public decimal EffectiveTaxPercent { get; set; }

    public string ProductImage { get; set; }

    public bool ShippingRequired { get; set; }
    public string ReturnProductReason { get; set; }
    public string OtherReason { get; set; }
}



 public class LineTaxBO
{
    public long TaxId { get; set; }
    public string TaxClassId { get; set; }
    public Decimal Amount { get; set; }

    public Decimal Percentage { get; set; }

    public string TaxOverrideReason { get; set; }
}

 public class LineDiscountBO
  {
    public long DiscountId { get; set; }
    public Decimal Amount { get; set; } 
 }
这是我的序列化方法,我不知道如何设置层次结构的值

   public static BasketBO DeserializeBasket(ServiceStack.Text.JsonObject data)//JObject data)
    {

        var basketBo = new MainBO;
        basketBo.Items = data.ArrayObjects("Items").ConvertAll<BasketItem>(x => new BasketItem
        {
            BasketItemId = Convert.ToInt32(x["BasketItemId"]),
            CurrentPrice = Convert.ToDecimal(x["CurrentPrice"]),
            OriginalQuantity = Convert.ToInt32(x["OriginalQuantity"]),
            ItemId = x["ItemId"],
            Upc = x["Upc"],
            Quantity = Convert.ToInt32(x["Quantity"]),
            Name = x["Name"],
            Taxable = Convert.ToBoolean(x["Taxable"]),
            Taxcode = x["Taxcode"],
            TaxOverrideReason = x["TaxOverrideReason"],
            ShippingCost = Convert.ToDecimal(x["ShippingCost"]),
            AppliedTaxes = x.ArrayObjects("AppliedTaxes") != null ? x.ArrayObjects("AppliedTaxes").ConvertAll<LineTaxBO>(tax => new LineTaxBO
            {
                Amount = Convert.ToDecimal(tax["Amount"]),
                Percentage = Convert.ToDecimal(tax["Percentage"]),
                TaxClassId = tax["TaxClassId"],
                TaxId = Convert.ToInt64(tax["TaxId"]),
                TaxOverrideReason = tax["TaxOverrideReason"]

            }) : null,
            AppliedDiscounts = x.ArrayObjects("AppliedDiscounts") != null ? x.ArrayObjects("AppliedDiscounts").ConvertAll<LineDiscountBO>(discount => new LineDiscountBO
            {
                Amount = Convert.ToDecimal(discount["Amount"]),
                DiscountId = Convert.ToInt64(discount["DiscountId"])

            }) : null,
            Hierarchy =  x.ArrayObjects("Hierarchy").ConvertAll<string>(str => str.ToString()),
        });



        return basketBo;
    }
publicstaticbasketbo反序列化basket(ServiceStack.Text.JsonObject数据)//作业对象数据)
{
var basketBo=新的MainBO;
basketBo.Items=data.arrayObject(“Items”).ConvertAll(x=>newbasketitem
{
BasketItemId=Convert.ToInt32(x[“BasketItemId]”),
CurrentPrice=Convert.ToDecimal(x[“CurrentPrice”]),
原始数量=转换为32(x[“原始数量”),
ItemId=x[“ItemId”],
Upc=x[“Upc”],
数量=转换为32(x[“数量”]),
Name=x[“Name”],
应税=转换为ToBoolean(x[“应税”]),
Taxcode=x[“Taxcode”],
TaxOverrideReason=x[“TaxOverrideReason”],
ShippingCost=Convert.ToDecimal(x[“ShippingCost”]),
AppliedTaxes=x.ArrayObject(“AppliedTaxes”)!=null?x.ArrayObject(“AppliedTaxes”).ConvertAll(税=>新行税
{
金额=转换为具体金额(税[“金额]),
百分比=转换为特定值(税[“百分比]),
TaxClassId=税[“TaxClassId”],
TaxId=转换为64(tax[“TaxId”]),
TaxOverrideReason=税收[“TaxOverrideReason”]
}):null,
AppliedDiscounts=x.ArrayObjects(“AppliedDiscounts”)!=null?x.ArrayObjects(“AppliedDiscounts”).ConvertAll(折扣=>新行折扣)
{
金额=转换为具体金额(折扣[“金额]),
折扣ID=Convert.ToInt64(折扣[“折扣ID”])
}):null,
Hierarchy=x.ArrayObject(“Hierarchy”).ConvertAll(str=>str.ToString()),
});
返回篮筐;
}

这有几个问题,您应该避免使用像IList这样的。另一个问题是默认情况下ServiceStack.Text-only Serialiser公共属性,因此您应该将可序列化模型更改为:

public class MainBO
{
    List<TaxItem> Taxes { get; set; }
    List<string> Parentlevels { get; set; }
}

我忘了提到我的所有属性都是公共的,只有getter和setter。ie我的类是公共类MainBO{public Taxes IList{get;set;}公共Parentlevels IList{get;set;}----一些其他标准类型属性}@jereeshthomas除非您提供有错误的代码和json,否则不太可能有人能够识别问题并帮助您。另外,永远不要使用像IList这样的接口,实际上它是一个无用的接口,因为它几乎总是隐藏一个具体的列表,在序列化中更糟糕的是,它只添加了耦合。还请提供您正试图反序列化的确切JSON,您的问题显示属性名和值中带有空格的草率JSON,我们无法判断您的JSON是否错误或粘贴不小心。@jereeshthomas仅使用
var dto=JSON.FromJson()
有什么问题?dto似乎已填充,缺少什么?@mythz我的参数是JsonObject,我无法更改它,我已将其序列化为字符串,然后使用json.FromJson,它似乎正常工作,谢谢您的输入。有什么方法可以直接从JsonObject转换吗?我尝试了ConvertTo方法,但没有得到正确的值。@jereeshthomas JsonObject是从JSON字符串创建的,因此您应该可以访问原始JSON字符串,我建议您这样做,它也是可以将其强制转换到的
字典
的包装器。只有
ConvertTo
可以将其转换为其他对象。
public class MainBO
{
    List<TaxItem> Taxes { get; set; }
    List<string> Parentlevels { get; set; }
}
JsConfig.IncludePublicFields = true;