2017-06-22 6 views
1

私は膨大な情報を持つ巨大なクラスを持っています。私がJSONに印刷したいという情報がありますが、すべての情報ではありません。オブジェクトをJSONにシリアル化すると、コースからすべての情報が出力されます。.NETオブジェクトを他のオブジェクトにマージする

私はJSONで印刷したいデータのテンプレートClassを作ったと思いました。そして、テンプレートに存在するすべての値を元のクラスからコピーし、残りの部分をスキップします。それから私はそのテンプレートClassを直列化することができます。例えば

enter image description here

今、私は何を達成しようとすると、placeからplaceJSONにデータをコピーすることです。

enter image description here

だから、結果はこのようになります:私はplaceで同じプロパティ名placeJSON内とすると、すべてのプロパティをループに存在する必要があり、私はその値をコピーしてくださいと思ったenter image description here

。しかし、ネストしたクラスの場合は、Countryのようにする必要があります。

どうすればいいですか?

+3

多くのJSONライブラリはshouldn特定のプロパティをマーキングするための属性をサポート」シリアライズする必要があります。使用しているシリアライザのマニュアルを確認してください。 – mason

+0

@mason真面目な...だから私は間違った道を歩いている?私はNewtonsoft JSONを使用します。そのドキュメントを確認します – NLAnaconda

+1

'JsonIgnoreAttribute' – Plutonix

答えて

0

私は解決策を書いてここで共有し始めました。おそらくまだ完璧ではないかもしれないが、それはスタートだ。

Public Shared Function mergeObjectInTemplatedata(template As Object, 
               source As Object, 
               Optional parents As List(Of String) = Nothing) As Object 

    If parents Is Nothing Then 
     parents = New List(Of String) 
    End If 

    For Each prop As PropertyInfo In template.GetType().GetProperties() 

     Dim value As Type = prop.GetValue(template).GetType() 
     If value = GetType(String) Or value = GetType(Integer) Then 

      prop.SetValue(template, getFromSource(source, parents, prop.Name)) 

     Else 
      parents.Add(prop.Name) 
      mergeObjectInTemplatedata(prop.GetValue(template), source, parents) 
     End If 

    Next 

    Return template 
End Function 

Private Shared Function getFromSource(source As Object, 
             location As List(Of String), 
             propertyName As String) As Object 

    Dim obj As Object = source 
    For Each item As String In location 
     obj = CallByName(obj, item, CallType.Get) 
    Next 
    Return CallByName(obj, propertyName, CallType.Get) 
End Function 
0

JSONにシリアル化する新しい匿名型を作成するだけではない理由はありますか?

例えば(私はC#のではなく、VBを知っている、との質問には、C#としてタグ付けされたので、私はこれが使用可能であることを望む!):

class Place { 
     public string Name { get; set; } 
     public CountryItem Country { get; set; } 
     //other properties... 
     public object ToPlaceJson() { 
      return new { name = Name, country = Country }; 
     } 
} 
+0

ありがとうございます。このようにしたいのは、これをたくさん(本当にたくさん)行う必要があるからです。 'name = Name'、' country = Country'、 'latitude = Latitude'、' longitude = Longitude'、..、...、...のように書くのではなく、 * 100回]。名前が同じであれば、それをプログラム的に行うことができるはずだと思いました。 – NLAnaconda

関連する問題