2012-02-27 73 views
2

多次元配列をこの形式のJSONデータに変換しました。JSONデータをVB.NET多次元配列に変換

私は例外をスローこの

Dim retValue As List(Of String) 
Dim deserializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer() 

retValue deserializer.Deserialize(Of List(Of String))(o.value) 

そのようJavascriptSerializerを使用して同等のフォームに文字列/整数のこの多次元配列をCONVERしようとしています

"[[null,null,null,null,null,null],[null,null,null,1,1,null],[null,null,null,null,1,1],[null,null,null,null,null,null],[null,null,null,null,null,null]]" 

Type 'System.String' is not supported for deserialization of an array.

私はそれをキャスト同じことを試してみました整数 が、同じ例外が発生しました。

.NET 3.5を使用して変換を実行するにはどうすればよいですか。

System.Web.Script.Serialization.JavaScriptSerializerがジョブを実行できる場合、JSON.NET dllを使用したくありません。

提案がありますか?

+0

[null、null、null、1,1、null] - > 1は文字列ではなく、[null、null、null、 "1"、 "1"、null] ] – Myra

+0

@Myra okですが、Integerでも変換を試みましたが、結果は同じです、例外メッセージju stがIntegerに変更されました。ありがとう –

+0

DataContractJsonSerialiser(http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx)について考えましたか?私はまた、DataContractを直列化して前後するために、オブジェクトに(Stringのリストではなく)DataContractを適用するように誘惑されるでしょう。 – SeanCocteau

答えて

0

をJavaScriptSerializer試していないが、テストしているとDataContractJsonSerialiserを使用して、次の作業を確認しましたコメント: -

Dim o As Object = JSONField 
Dim castObj() As Object = Nothing 
Dim ser As New DataContractJsonSerializer(GetType(System.Object)) 

Using ms As New MemoryStream(System.Text.Encoding.UTF8.GetBytes(o.Value().ToString)) 
    castObj = ser.ReadObject(ms) 
End Using 

Dim convObject As ArrayList = New ArrayList(castObj) 

この形式では、arrayListを取得して、内部のarrayListを適切に反復してキャストすることができました私が試した

第二の溶液: - このフォーマットで

Dim o As Object = JSONField 
    Dim obj() As Object = (New JavaScriptSerializer()).Deserialize(Of Object)(o.Value.ToString()) 
    Dim convObject As ArrayList = New ArrayList(obj) 

も、私は、ArrayListのを取得することができたし、その後先端を与えるための適切

おかげSeanCocteauを反復して鋳造することにより、各内部のArrayListを取ります最初にオブジェクトに変換する:

+1

'JSONField'は何ですか? –

+0

@JoeCoderGuy JSONFieldには、jsonスタイルのオブジェクト[[a、b、c、d、e、f]、[g、h、i、j、k、l]] –

2

実際には文字列のギザギザの配列である場合、そのJsonを1次元の文字列リストに変換しようとしています。ジェネリックスでは、厳密に型指定された他のオブジェクトをスマートに入れ子にすることはできませんが(訂正を歓迎します)、それらを簡単には変換できません(厳密な構造を持たない限り、DataContractsを備えたPOCOが前進しません) 。

私のアプローチは、文字列、整数、配列がうまく共存できるObjectへの直列化です。彼らは単に必要に応じてボクシングをする必要があります。理想ではないと私は認めている。 「SeanCocteau年代あたりとして

- :私は解決策を達成するために二つの方法を試してみました...

string json = "[[null,null,null,null,null,null],[null,null,null,1,1,null],[null,null,null,null,1,1],[null,null,null,null,null,null],[null,null,null,null,null,null]]"; 
      object castObj = null; 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(System.Object)); 

      // Create dummy stream to read into 
      using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json))){ 
       castObj = ser.ReadObject(ms); 
      } 

HTH

+0

ありがとうございました。その後、ObjectをArrayListに変換し、インデックスを使用してArrayList内から各ArrayListを取得しました。私は鮮明なものを探しています。キャッチされたのは、私がサーバーに戻ってきたオブジェクトの型を知っていることです。 –

+0

Tbh - あなたが戻ってくるオブジェクトの種類を知っているなら、なぜDTO(データ転送オブジェクト)を使ってシリアル化してデシリアライズしないのですか?これは確かにあなたにボクシングの面倒を節約するでしょう... – SeanCocteau

+0

彼らは実際には整数です[0/1の列のいずれかを含む行列表現]。私はDeserializeを使って直接デシリアライズして型をキャストすることを望んでいましたが、その後私はあなたの提案に従いました –