2012-02-27 3 views
2

У меня есть многомерный массив, преобразованный в данные JSON в этом формате.Преобразование данных JSON в многомерный массив VB.NET

"[[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]]" 

Я пытаюсь CONVER этого многомерного массива строк/числа в эквивалентную форму, используя JavaScriptSerializer как этого

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) 

Его бросает исключение: Type 'System.String' is not supported for deserialization of an array.

Я попробовал то же литье его Целые числа , но такое же исключение произошло.

Как выполнить преобразование с помощью .NET 3.5.

Я не хочу использовать dll JSON.NET, если System.Web.Script.Serialization.JavaScriptSerializer может выполнить эту работу.

Любые предложения?

+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 к объекту (а не к списку строк) для сериализации взад и вперед ... – SeanCocteau

ответ

0

Я попробовал два способа достижения решения: -

В соответствии с «SeanCocteau лет комментарии: -

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, а затем принимать каждый внутренний ArrayList итерации и литья соответственно

Благодаря SeanCocteau для придания верхушки чтобы преобразовать его в Object сначала :)

+1

что такое 'JSONField'? –

+0

@JoeCoderGuy JSONField содержит объект стиля json [[a, b, c, d, e, f], [g, h, i, j, k, l]] –

2

Вы пытаетесь преобразовать этот Json в одномерный список строк, если на самом деле это Jagged Array of Strings. С Generics я не верю, что вы можете ловко вставлять другие сильно типизированные объекты (хотя я приветствую исправления), и вы не можете легко их преобразовать (если у вас нет жесткой структуры, в этом случае POCO с DataContracts будет способом продвижения вперед) ,

Мой подход заключается в сериализации в Object, где Strings, Integer и Arrays могут сосуществовать счастливо; они просто нуждаются в боксе, если это необходимо. Я не согласен. Я не пробовал, но JavaScriptSerializer проверил и подтвердил следующие работы с использованием DataContractJsonSerialiser ...

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 в столбцах]. Я надеялся непосредственно deserialise и напечатал тип, используя Deserialize. Но затем я следовал вашим предложениям –

 Смежные вопросы

  • Нет связанных вопросов^_^