Feeds:
投稿
コメント

Archive for 2012年5月

ちょっと空きました

さて、T4 テキストテンプレート(Text Template Transformation Toolkit)ってなんぞやっていうと文字列を生成するためのコードがかけるやつです
??ってなります。私もこれわかりません
平たく言えばテキストファイルを生成するインタプリタ言語みたいなやつです
単純にコードがかけるコードでいいか…

ということでつまりPublic classなんたらをT4テンプレート使うと書けるってお話ですが

こいつの便利なところはVB,C#を利用してコードファイル生成が可能な点です
今までなんかプロジェクト作ってコード書いてた私ですがそんな必要がなくなるわけですね!(

まあT4についてはMSDNなりBing先生やらぐーぐる先生に頼めばいくらでも出ます
今回はDataContractしたクラスの自動生成をやりたいと思います

つまりは.json→コードファイル化 です

さてさて、これはどうするかというとjsonをパースなんてまともにやってたら明らかに手作業でいいので
今からあげるものたちを使ってやりましょう
・JsonReaderWriterFactory
・XElement

参考としてneueccさんの記事が役立つかと思います

まずjsonを保存するなりなんなりしましょう
StreamReaderで読み込んでもいいかもしれません

次にJsonReaderWriterFactory.CreateJsonReader使います
それをXElement.Loadで読み込んでください
そしたらこのXElementさんを使ってごにょごにょしましょう

XElementを取得したらそのElementsを取得してなんたら~ってします
めんどくさいので取得してからの処理だけ書いときます

 Private Sub writeXElement(x As XElement)
        If x.FirstAttribute.Value = "object" Then
            If cacheName.Contains(x.Name.LocalName) Then Exit Sub
            cacheName.Add(x.Name.LocalName)
            Console.WriteLine("         <DataMember=""" + x.Name.LocalName + """> Public " + x.Name.LocalName + " As " + x.Name.LocalName)
            Console.WriteLine("     <DataContract>")
            Console.WriteLine("     Public Class " + x.Name.LocalName)
            x.Elements.AllOperate(Sub(t) writeXElement(t))
            Console.WriteLine("     End Class")
        ElseIf x.FirstAttribute.Value = "array" Then
            Dim className As String = x.Name.LocalName + "Info"
            Dim i As Integer = 0
            If cacheName.Contains(className) Then
                Dim __className As String = className
                While Not cacheName.Contains(__className)
                    i += 1
                    __className = className + i.ToString
                End While
                className = __className
            End If
            Console.WriteLine("         <DataMember=""" + x.Name.LocalName + """> Public " + x.Name.LocalName + " As " + className + "()")
            x.Elements.AllOperate(Sub(ts) writeXElement(ts, className))
            Else
                Console.WriteLine("         <DataMember=""" + x.Name.LocalName + """> Public " + x.Name.LocalName + " As " + x.FirstAttribute.Value)
            End If
    End Sub

まあConsoleでテストしてたのでいろいろおかしいですがこれをT4に合わせて書き直せばいいかなと

いろいろ抜けてるけど気にしない

こんくらいでこれは終わりで

広告

Read Full Post »