it-swarm.com.de

JSON-String in C # -Objekt konvertieren

Es wurde versucht, eine JSON-Zeichenfolge in ein Objekt in C # zu konvertieren. Mit einem wirklich einfachen Testfall:

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

Das Problem ist, dass routes_list niemals gesetzt wird. Es ist ein undefiniertes Objekt. Irgendwelche Ideen?

169
Justin

Es sieht so aus, als ob Sie versuchen, die Deserialisierung auf ein unformatiertes Objekt durchzuführen. Sie können eine Klasse erstellen, die das Objekt darstellt, in das Sie konvertieren. Dies ist besonders nützlich, wenn Sie mit größeren Objekten oder JSON-Zeichenfolgen arbeiten.

Zum Beispiel:

  class Test {

      String test; 

      String getTest() { return test; }
      void setTest(String test) { this.test = test; }

  }

Dann wäre Ihr Deserialisierungscode:

   JavaScriptSerializer json_serializer = new JavaScriptSerializer();
   Test routes_list = 
          (Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

Weitere Informationen finden Sie in diesem Tutorial: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx

122
jmort253

Sie können die Newtonsoft.Json-Bibliothek auch wie folgt verwenden:

using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);

Dabei ist T Ihr Objekttyp, der Ihrer JSON-Zeichenfolge entspricht.

187
tripletdad99

Wahrscheinlich möchten Sie routes_list nicht einfach als object -Typ deklarieren. Es gibt keine .test-Eigenschaft, sodass Sie wirklich kein Nice-Objekt zurückerhalten. Dies ist eine der Stellen, an denen Sie besser eine Klasse oder eine Struktur definieren oder das dynamische Schlüsselwort verwenden sollten.

Wenn Sie wirklich möchten, dass dieser Code so funktioniert, wie Sie ihn haben, müssen Sie wissen, dass das von DeserializeObject zurückgegebene Objekt ein generisches Wörterbuch der Zeichenfolge object ist. Hier ist der Code, um es so zu machen:

var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);

Wenn Sie das dynamische Schlüsselwort verwenden möchten, Sie können lesen, wie hier .

Wenn Sie eine Klasse oder Struktur deklarieren, können Sie Deserialize anstelle von DeserializeObject folgendermaßen aufrufen:

class MyProgram {
    struct MyObj {
        public string test { get; set; }
    }

    static void Main(string[] args) {
        var json_serializer = new JavaScriptSerializer();
        MyObj routes_list = json_serializer.Deserialize<MyObj>("{ \"test\":\"some data\" }");
        Console.WriteLine(routes_list.test);

        Console.WriteLine("Done...");
        Console.ReadKey(true);
    }
}
55
mattmc3

Dynamisches Objekt mit JavaScriptSerializer verwenden.

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];

//test Result = "some data"
29

Newtonsoft ist schneller als der Script-Serializer Java. ... dies hängt vom Newtonsoft NuGet-Paket ab, das populär und besser als der Standard-Serializer ist.

einzeilige Code-Lösung.

var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
18
MSTdev

Hier ist eine einfache Klasse, die ich aus verschiedenen Beiträgen zusammengeschustert habe. Sie wurde ungefähr 15 Minuten lang getestet, aber scheint für meine Zwecke zu funktionieren. Es verwendet JavascriptSerializer, um die Arbeit zu erledigen, auf die in Ihrer App unter Verwendung der detaillierten Informationen verwiesen werden kann in diesem Beitrag .

Der folgende Code kann in LinqPad ausgeführt werden, um ihn zu testen:

  • Klicken Sie in LinqPad mit der rechten Maustaste auf die Registerkarte Ihres Skripts und wählen Sie "Abfrageeigenschaften".
  • Verweisen auf "System.Web.Extensions.dll" in "Weitere Verweise"
  • Hinzufügen eines "zusätzlichen Namespace-Imports" von "System.Web.Script.Serialization".

Ich hoffe es hilft!

void Main()
{
  string json = @"
  {
    'glossary': 
    {
      'title': 'example glossary',
        'GlossDiv': 
        {
          'title': 'S',
          'GlossList': 
          {
            'GlossEntry': 
            {
              'ID': 'SGML',
              'ItemNumber': 2,          
              'SortAs': 'SGML',
              'GlossTerm': 'Standard Generalized Markup Language',
              'Acronym': 'SGML',
              'Abbrev': 'ISO 8879:1986',
              'GlossDef': 
              {
                'para': 'A meta-markup language, used to create markup languages such as DocBook.',
                'GlossSeeAlso': ['GML', 'XML']
              },
              'GlossSee': 'markup'
            }
          }
        }
    }
  }

  ";

  var d = new JsonDeserializer(json);
  d.GetString("glossary.title").Dump();
  d.GetString("glossary.GlossDiv.title").Dump();  
  d.GetString("glossary.GlossDiv.GlossList.GlossEntry.ID").Dump();  
  d.GetInt("glossary.GlossDiv.GlossList.GlossEntry.ItemNumber").Dump();    
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef").Dump();   
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso").Dump(); 
  d.GetObject("Some Path That Doesnt Exist.Or.Another").Dump();   
}


// Define other methods and classes here

public class JsonDeserializer
{
  private IDictionary<string, object> jsonData { get; set; }

  public JsonDeserializer(string json)
  {
    var json_serializer = new JavaScriptSerializer();

    jsonData = (IDictionary<string, object>)json_serializer.DeserializeObject(json);
  }

  public string GetString(string path)
  {
    return (string) GetObject(path);
  }

  public int? GetInt(string path)
  {
    int? result = null;

    object o = GetObject(path);
    if (o == null)
    {
      return result;
    }

    if (o is string)
    {
      result = Int32.Parse((string)o);
    }
    else
    {
      result = (Int32) o;
    }

    return result;
  }

  public object GetObject(string path)
  {
    object result = null;

    var curr = jsonData;
    var paths = path.Split('.');
    var pathCount = paths.Count();

    try
    {
      for (int i = 0; i < pathCount; i++)
      {
        var key = paths[i];
        if (i == (pathCount - 1))
        {
          result = curr[key];
        }
        else
        {
          curr = (IDictionary<string, object>)curr[key];
        }
      }
    }
    catch
    {
      // Probably means an invalid path (ie object doesn't exist)
    }

    return result;
  }
}
13
Brad Parks

Mit der Newtonsoft.Json-Bibliothek können Sie Ihre Anforderungen auf einfache Weise erfüllen. Ich schreibe das eine Beispiel unten auf und schaue es mir an.

Klasse für den Objekttyp, den Sie erhalten:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }

}

Code:

static void Main(string[] args)
{

      string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}";

      User user = JsonConvert.DeserializeObject<User>(json);

      Console.ReadKey();
}

dies ist eine sehr einfache Möglichkeit, Ihren JSON zu analysieren.

11

fügen Sie diese DLL als Referenz für Ihr Projekt hinzu: System.Web.Extensions.dll

verwenden Sie diesen Namespace: mit System.Web.Script.Serialization;

public class IdName
{
    public int Id { get; set; }
    public string Name { get; set; }
}


   string jsonStringSingle = "{'Id': 1, 'Name':'Thulasi Ram.S'}".Replace("'", "\"");
   var entity = new JavaScriptSerializer().Deserialize<IdName>(jsonStringSingle);

   string jsonStringCollection = "[{'Id': 2, 'Name':'Thulasi Ram.S'},{'Id': 2, 'Name':'Raja Ram.S'},{'Id': 3, 'Name':'Ram.S'}]".Replace("'", "\"");
   var collection = new JavaScriptSerializer().Deserialize<IEnumerable<IdName>>(jsonStringCollection);
8
Thulasiram

Wie gesagt tripletdad99

var result = JsonConvert.DeserializeObject<T>(json);

wenn Sie jedoch kein zusätzliches Objekt erstellen möchten, können Sie es stattdessen mit Dictionary erstellen

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);
7
stanimirsp

Eine weitere schnelle und einfache Möglichkeit zur Halbautomatisierung dieser Schritte besteht darin,

  1. nehmen Sie den JSON, den Sie analysieren möchten, und fügen Sie ihn hier ein: http://json2csharp.com/ Kopieren Sie dann das Ergebnis und fügen Sie es in eine neue Klasse (z. B. MyClass) in Visual Studio ein.
  2. Benennen Sie "RootObject" in der Ausgabe von "json2csharp" in "MyClass" oder wie auch immer Sie es genannt haben.
  3. Gehen Sie im Visual Studio zu Website -> Pakete verwalten und fügen Sie mit NuGet Json.Net von Newtonsoft hinzu.

Verwenden Sie jetzt Code wie:

WebClient client = new WebClient();

string myJSON = client.DownloadString("https://URL_FOR_JSON.com/JSON_STUFF");

var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON);
4
Jason Hitchings

Kopieren Sie Ihren Json und fügen Sie ihn in das Textfeld json2csharp ein und klicken Sie auf die Schaltfläche Generieren.

Eine cs Klasse wird unter Verwendung der folgenden cs-Datei generiert

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

Wobei RootObject der Name der generierten cs Datei ist;

3
Islam

Zuerst müssen Sie eine Bibliothek einbinden wie:

using System.Runtime.Serialization.Json;

DataContractJsonSerializer desc = new DataContractJsonSerializer(typeof(BlogSite));
string json = "{\"Description\":\"Share knowledge\",\"Name\":\"zahid\"}";

using (var ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(json)))
{
    BlogSite b = (BlogSite)desc.ReadObject(ms);
    Console.WriteLine(b.Name);
    Console.WriteLine(b.Description);
}
0
Muhammad Zahid

Konvertieren Sie eine JSON-Zeichenfolge in ein Objekt in C #. Unter Verwendung des folgenden Testfalls. Sein arbeitete für mich. Hier ist "MenuInfo" mein C # -Klassenobjekt.

JsonTextReader reader = null;
try
{
    WebClient webClient = new WebClient();
    JObject result = JObject.Parse(webClient.DownloadString("YOUR URL"));
    reader = new JsonTextReader(new System.IO.StringReader(result.ToString()));
    reader.SupportMultipleContent = true;
}
catch(Exception)
{}

JsonSerializer serializer = new JsonSerializer();
MenuInfo menuInfo = serializer.Deserialize<MenuInfo>(reader);
0
Bhaskar