首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FastJson编码器错误

FastJson编码器错误
EN

Stack Overflow用户
提问于 2015-09-22 17:55:50
回答 2查看 75关注 0票数 0

我有一个类Sale,它保存销售数据,然后在sale类中有一个属性,它是一个SaleItem类的列表。

代码语言:javascript
复制
Sale
-date
-SaleItems <-- List(Of SaleItem)
-total

SaleItem类

代码语言:javascript
复制
SaleItem
-productID
-amt
-qty

当我转换为Json字符串并调试打印输出时。SaleItems没有被编码,只是丢失了。

我做错什么了,还是这可能是个窃听器?

编辑

销售类

代码语言:javascript
复制
Public Class Sale
    Private _Paid As Decimal
    Private _ListSaleItems As List(Of SaleItem)

    Public Sub New()
        ClearSaleItem()
    End Sub

    Public ReadOnly Property SaleItems() As List(Of SaleItem)
        Get
            Return _ListSaleItems
        End Get
    End Property


    Public Property Paid() As Decimal
        Get
            Return _Paid
        End Get
        Set
            _Paid = value
        End Set
    End Property


    Public Sub ClearSaleItem()
        _ListSaleItems = New List(Of SaleItem)()
    End Sub


    Public Function AddSaleItem(value As SaleItem) As Decimal
        If value Is Nothing Then
            Throw New ApplicationException("SaleItem cannot be empty")
        End If
        _ListSaleItems.Add(value)
    End Function
End Class

Saleitem类

代码语言:javascript
复制
Public Class SaleItem
    Private _ID As Int32
    Private _Quantity As Int32
    Private _SellPrice As Decimal


    Public Sub New()
        _Quantity = 0
        _SellPrice = 0
    End Sub

    Public Property SellPrice() As Decimal
        Get
            Return _SellPrice
        End Get
        Set
            _SellPrice = value
        End Set
    End Property

    Public Property Quantity() As Int32
        Get
            Return _Quantity
        End Get
        Set
            _Quantity = value
        End Set
    End Property

End Class

我用来转换的代码是

代码语言:javascript
复制
sockClient.Send(fastJSON.JSON.ToJSON(ObjSales))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-29 07:10:26

谢谢你的贡献,碰巧dll编码器给了我解决方案。

我必须将Sale的Saleitems属性从Readonly更改为读/写属性

代码语言:javascript
复制
Public Property SaleItems() As List(Of SaleItem)
            Get
                Return Me.listSaleItems
            End Get
Set(value as List(Of SaleItem))
                listSaleItems = value 
            End Get
        End Property

谢谢

票数 0
EN

Stack Overflow用户

发布于 2015-09-27 06:10:09

好的,下面是我的工作代码(用C#而不是VB)来证明这不是库中的bug:

代码语言:javascript
复制
namespace TestFastJson
{
    internal class Program
    {
            private static void Main()
            {
                    var sale = new Sale
                    {
                        SaleItems = new List<SaleItem>
                        {
                            new SaleItem(),
                            new SaleItem()
                        }
                    };

                    string jsonText = fastJSON.JSON.ToJSON(sale);

                    var newobj = fastJSON.JSON.ToObject<Sale>(jsonText);

                    Console.WriteLine(newobj.SaleItems.Count);
            }
    }

    public class Sale
    {
            public DateTime Date { get; set; }
            public List<SaleItem> SaleItems { get; set; }
            public int Total { get; set; }
    }

    public class SaleItem
    {
            public string ProductId { get; set; }
            public int Amount { get; set; }
            public string Quality { get; set; }
    }
}

输出

代码语言:javascript
复制
2

现在是你的密码。为什么AddSaleItem()返回一个Decimal?因为SaleItems被设置为private,所以缺少了SaleItems。切换到public,它就在这里。如果不能访问setter,库如何设置值?

具有有效输出的代码:

代码语言:javascript
复制
    Friend Class Program
        Private Shared Sub Main()
            Dim sale = New Sale()
            sale.AddSaleItem(New SaleItem())
            sale.AddSaleItem(New SaleItem())

            Dim jsonText As String = fastJSON.JSON.ToJSON(sale)

            Console.WriteLine(jsonText)

            Dim newobj = fastJSON.JSON.ToObject(Of Sale)(jsonText)
            Console.WriteLine(newobj.SaleItems.Count)
        End Sub
    End Class

    Public Class SaleItem
        Private _ID As Int32

        Public Sub New()
            Me.Quantity = 0
            Me.SellPrice = 0
        End Sub

        Public Property SellPrice() As Decimal
            Get
                Return m_SellPrice
            End Get
            Set
                m_SellPrice = Value
            End Set
        End Property
        Private m_SellPrice As Decimal
        Public Property Quantity() As Integer
            Get
                Return m_Quantity
            End Get
            Set
                m_Quantity = Value
            End Set
        End Property
        Private m_Quantity As Integer
    End Class

    Public Class Sale
        Public listSaleItems As List(Of SaleItem)
        Public Sub New()
            Me.ClearSaleItem()
        End Sub

        Public ReadOnly Property SaleItems() As List(Of SaleItem)
            Get
                Return Me.listSaleItems
            End Get
        End Property

        Public Property Paid() As Decimal
            Get
                Return m_Paid
            End Get
            Set
                m_Paid = Value
            End Set
        End Property
        Private m_Paid As Decimal

        Public Sub ClearSaleItem()
            Me.listSaleItems = New List(Of SaleItem)()
        End Sub

        Public Sub AddSaleItem(value As SaleItem)
            If value Is Nothing Then
                Throw New ApplicationException("SaleItem cannot be empty")
            End If
            Me.listSaleItems.Add(value)
        End Sub
    End Class

输出

代码语言:javascript
复制
2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32723664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档