2011-05-17 139 views
0

JSON.Net始终返回{}

Public Class Foo 
    Private fooz As Object 
    Private alao As ArrayList 

    Public Sub New(ByVal pfooz) 
     Me.fooz = New Object 
     Me.alao = New ArrayList() 

     Me.alao.Add(1) 
     Me.alao.Add(2) 
     Me.alao.Add(3) 
     Me.alao.Add(4) 
     Me.alao.Add(5) 
    End Sub 
End Class 

酒吧

Public Class Bar 
    Private baz As Integer 
    Private bar As String 
    Private foo As Foo 

    Public Sub New(ByVal pbaz, ByVal pbar, ByVal pfoo) 
     Me.baz = pbaz 
     Me.bar = pbar 
     Me.foo = pfoo 
    End Sub 
End Class 

我的形式

Public Class Form1 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim foo As Foo = New Foo(New Object) 
     Dim bar As Bar = New Bar(1, "FOOOOOOOOOOOOO, bar?", foo) 
     Dim fooString As String 
     Dim barString As String 

     fooString = Newtonsoft.Json.JsonConvert.SerializeObject(foo) 
     barString = Newtonsoft.Json.JsonConvert.SerializeObject(bar) 

     MsgBox(fooString) 
     MsgBox(barString) 
    End Sub 
End Class 

我总是{}作为答案。怎么了?

回答

2

这两个类都没有任何Public属性或字段。如果您想将字段表示为应该出现在JSON字符串中的值,请将它们公开。否则,就串行器而言,你给它的对象没有有趣的值。

+0

谢谢!加工! JSON.NET可以使用get方法而不是公共成员吗? – thom 2011-05-17 16:44:22

+0

@ thom:这是属性的用途。如果你使用公共'Get'方法创建一个公共属性,JSON.NET将会选择它。不要尝试像使用Java一样使用getXxx()风格的方法。另请注意,如果您想*序列化您的对象,则需要进行其他更改。 – StriplingWarrior 2011-05-17 17:02:25

+0

对于它的价值,我认为你可以通过向想要序列化的成员添加[JsonProperty属性](http://james.newtonking.com/projects/json/help/html/T_Newtonsoft_Json_JsonPropertyAttribute.htm)来解决该语义问题无论其访问修饰符如何。您可能必须将该类指定为[JsonObject](http://james.newtonking.com/projects/json/help/html/T_Newtonsoft_Json_JsonObjectAttribute.htm)才能正常工作。我真的不确定我的头顶。作为面向对象方法的一部分,一些人在哲学上反对吸气/安装者,所以这可能是有用的。 – tmesser 2011-05-17 17:04:27