Pregunta

Sé que hay unos postes sobre Newtonsoft así que espero que esto no es exactamente una repetición ... Estoy tratando de convertir los datos JSON devueltos por la API de Kazaa en un bonito objeto de algún tipo

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

List<string> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(reader.Read().ToString());

foreach (string item in list)
{
    Console.WriteLine(item);
}

//Console.WriteLine(reader.ReadLine());
stream.Close();

Esa línea JsonConvert es sólo el más reciente que estaba tratando ... No estoy bastante conseguirlo y esperaba para eliminar una serie de paredes pidiendo a ustedes. Yo estaba originalmente tratando de convertirlo en un diccionario o algo ... y, de hecho, sólo hay que enganchar un par de valores de allí, así, a juzgar por la documentación, tal vez LINQ de Newtonsoft a JSON podría ser una mejor elección? Pensamientos / Enlaces?

Este es un ejemplo de los datos de retorno JSON:

{
  "page": 1,
  "total_pages": 8,
  "total_entries": 74,
  "q": "muse",
  "albums": [
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "http://image.kazaa.com/images/69/01672812 1569/Yaron_Herman_Trio/Muse/Yaron_Herman_Trio-Muse_1.jpg",
      "id": 93098,
      "artist_name": "Yaron Herman Trio"
    },
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "htt p://image.kazaa.com/images/54/888880301154/Candy_Lo/Muse/Candy_Lo-Muse_1.jpg",
      "i d": 102702,
      "artist_name": "\u76e7\u5de7\u97f3"
    },
    {
      "name": "Absolution",
      "permalink": " Absolution",
      "cover_image_url": "http://image.kazaa.com/images/65/093624873365/Mus e/Absolution/Muse-Absolution_1.jpg",
      "id": 48896,
      "artist_name": "Muse"
    },
    {
      "name": "Ab solution",
      "permalink": "Absolution-2",
      "cover_image_url": "http://image.kazaa.com/i mages/20/825646911820/Muse/Absolution/Muse-Absolution_1.jpg",
      "id": 118573,
      "artist _name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Black-Holes-An d-Revelations",
      "cover_image_url": "http://image.kazaa.com/images/66/093624428466/ Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1.jpg",
      "id": 48813,
      "artist_name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Bla ck-Holes-And-Revelations-2",
      "cover_image_url": "http://image.kazaa.com/images/86/ 825646911486/Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1 .jpg",
      "id": 118543,
      "artist_name": "Muse"
    },
    {
      "name": "Origin Of Symmetry",
      "permalink": "Origin-Of-Symmetry",
      "cover_image_url": "http://image.kazaa.com/images/29/825646 912629/Muse/Origin_Of_Symmetry/Muse-Origin_Of_Symmetry_1.jpg",
      "id": 120491,
      "artis t_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz",
      "cover_image_url": "http: //image.kazaa.com/images/68/825646182268/Muse/Showbiz/Muse-Showbiz_1.jpg",
      "id": 60444,
      "artist_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz-2",
      "cover_imag e_url": "http://image.kazaa.com/images/50/825646912650/Muse/Showbiz/Muse-Showbiz_ 1.jpg",
      "id": 118545,
      "artist_name": "Muse"
    },
    {
      "name": "The Resistance",
      "permalink": "T he-Resistance",
      "cover_image_url": "http://image.kazaa.com/images/36/825646864836/ Muse/The_Resistance/Muse-The_Resistance_1.jpg",
      "id": 121171,
      "artist_name": "Muse"
    }
  ],
  "per_page": 10
}

He hecho un poco más la lectura y encontré LINQ de Newtonsoft a JSON es exactamente lo que quería ... utilizando WebClient, Stream, StreamReader y Newtonsoft ... Puedo golpear Kazaa de datos JSON, extraer una URL, descargue el archivo, y hacerlo todo en como siete líneas de código! Me encanta.

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());

// Instead of WriteLine, 2 or 3 lines of code here using WebClient to download the file
Console.WriteLine((string)jObject["albums"][0]["cover_image_url"]);
stream.Close();

Este mensaje se pone golpes hasta que pensé que podría ser útil para incluir el "uso de" bits que se discuten en los comentarios.

using(var client = new WebClient())
using(var stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"))
using (var reader = new StreamReader(stream))
{
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
    Console.WriteLine((string) jObject["albums"][0]["cover_image_url"]);
}
¿Fue útil?

Solución

Si sólo tiene que conseguir algunos artículos de objeto JSON, me gustaría utilizar LINQ de Json.NET a clase JObject JSON. Por ejemplo:

JToken token = JObject.Parse(stringFullOfJson);

int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");

Me gusta este enfoque, ya que no es necesario deserializar plenamente el objeto JSON. Esto viene muy bien con las API que a veces se pueden sorprender al que le faltan las propiedades del objeto, como Twitter.

Documentación: serializar y deserializar JSON con Json.NET y LINQ a JSON con Json.NET

Otros consejos

Puede utilizar el tipo C # dynamic para facilitar las cosas. Esta técnica también hace re-factorización más simple, ya que no se basa en la magia cuerdas.

JSON

La cadena JSON a continuación es una respuesta sencilla a partir de una llamada API HTTP, y define dos propiedades:. Id y Name

{"Id": 1, "Name": "biofractal"}

C #

Uso JsonConvert.DeserializeObject<dynamic>() para deserializar esta cadena en un tipo dinámico entonces simplemente acceder a sus propiedades de la forma habitual.

dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;

Si se especifica el tipo de la variable results como dynamic, en lugar de utilizar la palabra clave var, a continuación, los valores de las propiedades correctamente se deserializar, por ejemplo, Id a un int y no un JValue (gracias a GFoley83 por el comentario más abajo).

Nota : El enlace NuGet para el montaje Newtonsoft es http: // Nuget .org / paquetes / newtonsoft.json .

Paquete : También puede agregar el paquete con instalador vivo Nuget, con su proyecto abrió acaba de hacer paquete de exploración y luego simplemente instalarlo instalar, unistall, actualizar , se acaba de agregar a su proyecto en dependencias / NuGet

Con la palabra clave dynamic, se hace muy fácil de analizar cualquier objeto de este tipo:

dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
var page = x.page;
var total_pages = x.total_pages
var albums = x.albums;
foreach(var album in albums)
{
    var albumName = album.name;

    // Access album data;
}

corrígeme si me equivoco, pero el ejemplo anterior, creo, es sólo un poco fuera de sincronización con la última versión de la biblioteca Json.NET de James Newton.

var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];

Si, como yo, que prefieren tratar con objetos inflexible ** pase con:

MyObj obj =  JsonConvert.DeserializeObject<MyObj>(jsonString);

De esta manera se llega a utilizar IntelliSense y la comprobación de tipos de error en tiempo de compilación.

Se puede crear fácilmente los objetos necesarios copiando su JSON en la memoria y pegándolo como objetos JSON (Visual Studio -> Editar -> Pegado especial -> Pegar como JSON clases).

Consulte aquí si no tiene esa opción en Visual Studio.

También tendrá que asegurarse de que su JSON es válido. Añadir su propio objeto en el inicio si es sólo un conjunto de objetos. es decir, { "obj": [{}, {}, {}]}

** Sé que dinámico facilita las cosas a veces, pero yo soy un poco ol'skool con esto.

Deserialize y obtener el valor (cuando la colección es dinámica):

// First serializing
dynamic collection = new { stud = stud_datatable }; // The stud_datable is the list or data table
string jsonString = JsonConvert.SerializeObject(collection);


// Second Deserializing
dynamic StudList = JsonConvert.DeserializeObject(jsonString);

var stud = StudList.stud;
foreach (var detail in stud)
{
    var Address = detail["stud_address"]; // Access Address data;
}

Me gusta este método:

using Newtonsoft.Json.Linq;
// jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

Ahora puede acceder a cualquier cosa que desee mediante la dictObj como un diccionario. También puede utilizar Dictionary<string, string> si lo prefiere para obtener los valores como cadenas.

Se puede utilizar este mismo método para reparto como cualquier tipo de objeto de .NET.

Also, if you're just looking for a specific value nested within the JSON content you can do something like so:

yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName");

And so on from there.

This could help if you don't want to bear the cost of converting the entire JSON into a C# object.

i craeted an Extionclass for json :

 public static class JsonExtentions
    {
        public static string SerializeToJson(this object SourceObject) { return Newtonsoft.Json.JsonConvert.SerializeObject(SourceObject); }


        public static T JsonToObject<T>(this string JsonString) { return (T)Newtonsoft.Json.JsonConvert.DeserializeObject<T>(JsonString); }
}

Design-Pattern:

 public class Myobject
    {
        public Myobject(){}
        public string prop1 { get; set; }

        public static Myobject  GetObject(string JsonString){return  JsonExtentions.JsonToObject<Myobject>(JsonString);}
        public  string ToJson(string JsonString){return JsonExtentions.SerializeToJson(this);}
    }

Usage:

   Myobject dd= Myobject.GetObject(jsonstring);

                 Console.WriteLine(dd.prop1);

Fairly late to this party, but I came across this issue myself today at work. Here is how I solved the issue.

I was accessing a 3rd party API to retrieve a list of books. The object returned a massive JSON object containing roughly 20+ fields, of which I only needed the ID as a List string object. I used linq on the dynamic object to retrieve the specific field I needed and then inserted it into my List string object.

dynamic content = JsonConvert.DeserializeObject(requestContent);
var contentCodes = ((IEnumerable<dynamic>)content).Where(p => p._id != null).Select(p=>p._id).ToList();

List<string> codes = new List<string>();

foreach (var code in contentCodes)
{
    codes.Add(code?.ToString());
}

Finally Get State Name From JSON

Thankyou!

Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.collections.generic

Public Module Module1
    Public Sub Main()

         Dim url As String = "http://maps.google.com/maps/api/geocode/json&address=attur+salem&sensor=false"
            Dim request As WebRequest = WebRequest.Create(url)
        dim response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
        dim reader As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
          Dim dataString As String = reader.ReadToEnd()

        Dim getResponse As JObject = JObject.Parse(dataString)

        Dim dictObj As Dictionary(Of String, Object) = getResponse.ToObject(Of Dictionary(Of String, Object))()
        'Get State Name
        Console.WriteLine(CStr(dictObj("results")(0)("address_components")(2)("long_name")))
    End Sub
End Module
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top