Desglosar un string en partes.

Iniciado por **Aincrad**, 26 Diciembre 2018, 21:21 PM

0 Miembros y 1 Visitante están viendo este tema.

**Aincrad**

bueno quiero separar todo este texto en partes. pero no se como hacerlo.

texto>

 
Código (php) [Seleccionar]
  {"error":false,"title":"Alan Walker - Diamond Heart (feat. Sophia Somajo)","duration":218,"file":"http:\/\/michaelbelgium.me\/ytconverter\/download\/sJXZ9Dok7u8.mp3"}



Quiero separarlo en partes , como cuando se lee un archivo .ini, asi >

el "error": | "title": | "duration" | "file": | quiero obtener el resultado que le sigue. Por ejemplo el de error el resultado es false , es algo así como leer un .ini.

gracias de antemano!!




Eleкtro

#1
El formato se conoce como JSON.

Teniendo un string JSON como este (el cual he formateado para que sea legible, pero no es necesario hacerlo):
Código (vbnet) [Seleccionar]
Dim jsonStr As String =
   <json>
   {
      "error":false,
      "title":"Alan Walker - Diamond Heart (feat. Sophia Somajo)",
      "duration":218,
      "file":"http:\/\/michaelbelgium.me\/ytconverter\/download\/sJXZ9Dok7u8.mp3"
   }
   </json>.Value


Si quieres llevar a cabo una conversión genérica, me refiero, de uso reutilizable, entonces:
Código (vbnet) [Seleccionar]
Dim dict As Dictionary(Of String, Object) =
   New JavaScriptSerializer().Deserialize(Of Dictionary(Of String, Object))(jsonStr)

...
Código (vbnet) [Seleccionar]
For Each item As KeyValuePair(Of String, Object) In dict
   Console.WriteLine("{0}: {1}", item.Key, item.Value.ToString())
Next item

...
Código (vbnet) [Seleccionar]
Console.WriteLine(CBool(dict("error")))
Console.WriteLine(CStr(dict("title")))
Console.WriteLine(CInt(dict("duration")))
Console.WriteLine(CStr(dict("file")))


Si por lo contrario quieres una solución adaptada al string JSON que has mostrado, entonces:
Código (vbnet) [Seleccionar]
<Serializable>
Public NotInheritable Class MyType
   Public Property [Error] As Boolean
   Public Property Title As String
   Public Property Duration As Integer
   Public Property File As String

   Public Sub New()
   End Sub

   Public Overrides Function ToString() As String
       Return New JavaScriptSerializer().Serialize(Me).ToString
   End Function
End Class

...
Código (vbnet) [Seleccionar]
Dim obj As MyType = New JavaScriptSerializer().Deserialize(Of MyType)(jsonStr)
Console.WriteLine(obj.ToString())


PD: Para soluciones algo más sofisticadas siempre puedes utilizar la librería gratuita JSON.NET (la cual usan empresas tan profesionales como Google y Microsoft para algunas de sus APIs para .NET).

Saludos.








**Aincrad**

#2
Gracias de responder como siempre @Elektro, pero estoy trabajando con .net framework 4.0 , en vs 2010.

El tipo 'JavaScriptSerializer' no está definido.

no quiero usar ningún tipo de librería., simplemente quiero leerlo como si fuera un .txt

No es posible mejor desglosarlo todo como si se estuviera leyendo un .ini?.




Eleкtro

#3
Cita de: **Aincrad** en 26 Diciembre 2018, 22:22 PMGracias de responder como siempre @Elektro, pero estoy trabajando con .net framework 4.0 , en vs 2010.

Según la documentación oficial, la clase JavaScriptSerializer está disponible a partir de .NET 3.5, por lo tanto no deberías tener problema...
https://docs.microsoft.com/en-us/dotnet/api/system.web.script.serialization.javascriptserializer?view=netframework-4.7.2
Asegúrate de haber añadido una referencia al ensamblado con nombre 'System.Web.Extensions', e importar el esapacio de nombres 'System.Web.Script.Serialization'.

Cita de: **Aincrad** en 26 Diciembre 2018, 22:22 PMNo es posible mejor desglosarlo todo como si se estuviera leyendo un .ini?.

Poder se puede, pero resultaría muy tedioso. Algo muy sencillo sería partir la cadena de texto usando la coma "," como caracter delimitador, con esto obtienes un array, entonces, cada elemento del array lo volverías a partir usando esta vez el caracter ":" como delimitador, y así obtener el nombre y el valor de cada cosa (ej: {"duration", "218"}), pero esto que en principio parece muy sencillo te podría dar problemas si el campo "title" contiene cualquiera de esos dos caracteres, por lo que habría que ingeniárselas mejor, y de ahí que sea tedioso. Sería mejor usar RegEx para capturar los valores (escritos entre comillas), pero no estoy por la labor de ponerme a construir una expresión regular, pudiendo recurrir a soluciones sofisticadas como la clase JavaScriptSerializer, o la librería JSON.NET.

Un saludo.








**Aincrad**

#4


MOD: Imagen adaptada a lo permitido.




Eleкtro

Vuelve a leer por favor:

Cita de: ElektroAsegúrate de haber añadido una referencia al ensamblado con nombre 'System.Web.Extensions', e importar el espacio de nombres 'System.Web.Script.Serialization'.

El espacio de nombres que aparece en la imagen que has mostrado, no es el que he mencionado que debes importar. Y antes de poder importarlo, debes añadir una referencia al ensamblado que también mencioné.

Acabo de compilar en .NET 4.0 el código que mostré, y funciona perfectamente. Por otro lado, la clase JavaScriptSerializer NO está disponible en .NET 4.0 Client Profile. En resumen, el código lo puedes compilar con .NET 4.0 sin problemas, pero no lo puedes compilar en .NET 4.0 Client Profile.

Feliz Navidad.








**Aincrad**

Perdona mi ignorancia, estoy en .NET 4.0 pero sigue con >

El tipo 'JavaScriptSerializer' no está definido.













Eleкtro

¿Puedes mostrar la pestaña "Referencias" o en su defecto pasarme el proyecto?.








**Aincrad**





Eleкtro

Cita de: **Aincrad** en 27 Diciembre 2018, 00:24 AM
te envié el proyecto por priv,

En tu proyecto falta que añadas una referencia al ensamblado que te dije: System.Web.Extensions.dll. Una vez añadida la referencia, se puede utilizar la clase JavaScriptSerializer.

Dirígete a la pestaña "Referencias" y añade la maldita librería. xD

Saludos