So erstellen Sie eine JSON-Zeichenfolge in C #

238

Ich habe gerade den XmlWriter verwendet, um XML zu erstellen, das in einer HTTP-Antwort zurückgesendet werden soll. Wie würden Sie eine JSON-Zeichenfolge erstellen? Ich nehme an, Sie würden nur einen Stringbuilder verwenden, um den JSON-String zu erstellen, und sie formatieren Ihre Antwort als JSON?

PositiveGuy
quelle
Überprüfen Sie diese 3 Möglichkeiten, um Daten in JSON-Zeichenfolge in Asp.net C # codepedia.info/2015/07/… zu konvertieren
Satinder singh

Antworten:

249

Sie können die JavaScriptSerializer-Klasse verwenden . Lesen Sie diesen Artikel , um eine nützliche Erweiterungsmethode zu erstellen.

Code aus Artikel:

namespace ExtensionMethods
{
    public static class JSONHelper
    {
        public static string ToJSON(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(obj);
        }

        public static string ToJSON(this object obj, int recursionDepth)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RecursionLimit = recursionDepth;
            return serializer.Serialize(obj);
        }
    }
}

Verwendung:

using ExtensionMethods;

...

List<Person> people = new List<Person>{
                   new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"},
                   new Person{ID = 2, FirstName = "Bill", LastName = "Gates"}
                   };


string jsonString = people.ToJSON();
CMS
quelle
Ja, ich versuche nur herauszufinden, wie der JSON-Text zuerst gebildet wird. Danke
PositiveGuy
Was ist, wenn Sie .NET 3.5 nicht verwenden? da ** it
PositiveGuy
2
JavaScriptSerializer ist Teil von ASP.NET Ajax 1.0, wenn Sie es aus .NET 2.0 verwenden möchten.
Joe Chung
2
Sie können es weiterhin verwenden. Sein Teil der ASP.NET 2.0 AJAX Extensions 1.0: asp.net/AJAX/Documentation/Live/mref/…
Naren
Unser Projekt kann in VS 2008 eröffnet werden ... also wurde es irgendwann konvertiert. Bedeutet das, dass wir jetzt .NET 3.5 in unserer vorhandenen Codebasis verwenden können?
PositiveGuy
366

Die Verwendung von Newtonsoft.Json macht es wirklich einfacher:

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);

Dokumentation: Serialisieren und Deserialisieren von JSON

Orr
quelle
8
MS versenden NewtonSoft jetzt standardmäßig in der VS MVC4-Projektvorlage
Chris F Carroll
45
Sie können bei Bedarf auch anonyme Objekte serialisieren : string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman
9
@ MattBeckman Ich erhalte "Ungültiger anonymer Typ-Mitgliedsdeklarator. Anonyme Typ-Mitglieder müssen mit einer Mitgliederzuweisung, einem einfachen Namen oder einem Mitgliederzugriff deklariert werden. Sollte nicht "PropertyA"sein PropertyA?
Jonah
Wir müssen also eine Klasse und Objekte implementieren, um einen einfachen json zu konstruieren! Stellen Sie sich verschachtelte - nicht feste Arrays - Elemente vor. Ich kann nicht verstehen, warum so viel Begeisterung in der Luft liegt!
Vassilis
6
@ MattBeckman @ Jonah ist string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });ohne doppelte Anführungszeichen aufPropertyA.
Jose
18

Diese Bibliothek ist sehr gut für JSON von C #

http://james.newtonking.com/pages/json-net.aspx

Hugoware
quelle
1
Lassen Sie mich fragen, welche Vorteile die Verwendung dieses Frameworks gegenüber der oben erwähnten Hilfsmethode CMS bietet.
PositiveGuy
1
ermöglicht Ihnen eine feinere Granularität über den JSON, z. B. können Sie angeben, ob Nullen enthalten sein sollen oder nicht usw.
redsquare
17

Einfache Verwendung der Bibliotheken Newtonsoft.Json und Newtonsoft.Json.Linq .

        //Create my object
        var my_jsondata = new
        {
            Host = @"sftp.myhost.gr",
            UserName = "my_username",
            Password = "my_password",
            SourceDir = "/export/zip/mypath/",
            FileName = "my_file.zip"
        };

        //Tranform it to Json object
        string json_data = JsonConvert.SerializeObject(my_jsondata);

        //Print the Json object
        Console.WriteLine(json_data);

        //Parse the json object
        JObject json_object = JObject.Parse(json_data);

        //Print the parsed Json object
        Console.WriteLine((string)json_object["Host"]);
        Console.WriteLine((string)json_object["UserName"]);
        Console.WriteLine((string)json_object["Password"]);
        Console.WriteLine((string)json_object["SourceDir"]);
        Console.WriteLine((string)json_object["FileName"]);
Dr. K.
quelle
Einfach und handlich. Vielen Dank.
QMaster
13

Dieses Codefragment verwendet den DataContractJsonSerializer von System.Runtime.Serialization.Json in .NET 3.5.

public static string ToJson<T>(/* this */ T value, Encoding encoding)
{
    var serializer = new DataContractJsonSerializer(typeof(T));

    using (var stream = new MemoryStream())
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding))
        {
            serializer.WriteObject(writer, value);
        }

        return encoding.GetString(stream.ToArray());
    }
}
Joe Chung
quelle
3
Also ... kommentieren Sie die 'this'-Referenz aus, damit dieses Snippet tatsächlich funktioniert. Wenn Sie zuvor noch nicht mit Erweiterungsmethoden gearbeitet haben, ist dies möglicherweise nicht offensichtlich.
Dan Esparza
7

Unter http://www.codeplex.com/json/ finden Sie das Projekt json-net.aspx. Warum das Rad neu erfinden?

Josh
quelle
3
hängt davon ab, dass ich mich möglicherweise nicht auf ein Open Source-Plugin eines Drittanbieters verlassen möchte, nur um JSON zu erstellen. Ich würde die String / Helper-Methode lieber selbst erstellen.
PositiveGuy
7

Sie können auch meinen ServiceStack JsonSerializer ausprobieren , der schnellste .NET JSON-Serializer . Es unterstützt die Serialisierung von DataContracts, POCO-Typen, Schnittstellen, spät gebundenen Objekten, einschließlich anonymer Typen usw.

Grundlegendes Beispiel

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

Hinweis: Verwenden Sie Microsoft JavaScriptSerializer nur, wenn die Leistung für Sie nicht wichtig ist, da ich sie aus meinen Benchmarks herausnehmen musste, da sie bis zu 40x-100x langsamer ist als die anderen JSON-Serializer.

Mythos
quelle
Ich habe JsonSerializer.SerializeToString mit einer Liste von Objekten ausprobiert und es wurde nur leeres json zurückgegeben: "[{}, {}]" pastebin.com/yEw57L3T So sieht mein Objekt aus, bevor ich SerializeToString i.imgur.com/dYIE7J1.png aufrufe Die Antwort mit der höchsten Abstimmung hier hat jedoch funktioniert und das zurückgegeben, was ich erwartet hatte: pastebin.com/aAtB3Gxu
Matthew Lock
Die schnellste .NET JSON-Serializer-Verbindung ist unterbrochen.
6

Wenn Sie ein komplexes Ergebnis benötigen (eingebettet), erstellen Sie Ihre eigene Struktur:

class templateRequest
{
    public String[] registration_ids;
    public Data data;
    public class Data
    {
        public String message;
        public String tickerText;
        public String contentTitle;
        public Data(String message, String tickerText, string contentTitle)
        {
            this.message = message;
            this.tickerText = tickerText;
            this.contentTitle = contentTitle;
        }                
    };
}

und dann können Sie JSON-String mit Aufruf erhalten

List<String> ids = new List<string>() { "id1", "id2" };
templateRequest request = new templeteRequest();
request.registration_ids = ids.ToArray();
request.data = new templateRequest.Data("Your message", "Your ticker", "Your content");

string json = new JavaScriptSerializer().Serialize(request);

Das Ergebnis wird folgendermaßen aussehen:

json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"

Ich hoffe es hilft!

Subtiler Fuchs
quelle
5

Wenn Sie die beiden integrierten JSON-Serializer ( JavaScriptSerializer und DataContractJsonSerializer ) nicht verwenden können oder möchten, können Sie die JsonExSerializer- Bibliothek ausprobieren - ich verwende sie in einer Reihe von Projekten und funktioniert recht gut.

Tamas Czinege
quelle
1
Ich habe den JavaScriptSerializer ausprobiert und er funktioniert nicht gut mit Null-Objekten.
Luke101
1
@ Luke101: Wie genau? Ich meine, ich benutze es jeden Tag und hatte nie Probleme, also bin ich ehrlich neugierig! (Keine Ironie, ich bin wirklich neugierig, weil ich nie auf Probleme gestoßen bin)
Tamas Czinege
2

Wenn Sie versuchen, einen Webdienst zu erstellen, um Daten über JSON auf einer Webseite bereitzustellen, sollten Sie das ASP.NET Ajax-Toolkit verwenden:

http://www.asp.net/learn/ajax/tutorial-05-cs.aspx

Es konvertiert automatisch Ihre Objekte, die über einen Webservice bereitgestellt werden, in json und erstellt die Proxy-Klasse, mit der Sie eine Verbindung herstellen können.

Eduardo Scoz
quelle
Es wäre nur ein Aufruf einer .ashx-Datei, die eine JSON-Zeichenfolge zurückgibt. Zuerst versuche ich nur herauszufinden, wie man den String bildet. Verwenden Sie einen StringBuilder? Zweitens dann ja, wie man serialisiert. Wenn Sie XML zurückgeben, legen Sie einfach den Inhaltstyp der Antwort fest: context.Response.ContentType = "text / xml"
PositiveGuy
1

Die DataContractJsonSerializer wird mit dem gleichen einfach wie die XMLSerializer alles für Sie tun. Es ist trivial, dies in einer Web-App zu verwenden. Wenn Sie WCF verwenden, können Sie dessen Verwendung mit einem Attribut angeben. Die DataContractSerializer-Familie ist ebenfalls sehr schnell.

Steve
quelle
1

Ich habe festgestellt, dass Sie den Serializer überhaupt nicht benötigen. Wenn Sie das Objekt als Liste zurückgeben. Lassen Sie mich ein Beispiel verwenden.

In unserem asmx erhalten wir die Daten mit der Variablen, die wir weitergegeben haben

// return data
[WebMethod(CacheDuration = 180)]
public List<latlon> GetData(int id) 
{
    var data = from p in db.property 
               where p.id == id 
               select new latlon
               {
                   lat = p.lat,
                   lon = p.lon

               };
    return data.ToList();
}

public class latlon
{
    public string lat { get; set; }
    public string lon { get; set; }
}

Dann greifen wir mit jquery auf den Dienst zu und geben diese Variable weiter.

// get latlon
function getlatlon(propertyid) {
var mydata;

$.ajax({
    url: "getData.asmx/GetLatLon",
    type: "POST",
    data: "{'id': '" + propertyid + "'}",
    async: false,
    contentType: "application/json;",
    dataType: "json",
    success: function (data, textStatus, jqXHR) { //
        mydata = data;
    },
    error: function (xmlHttpRequest, textStatus, errorThrown) {
        console.log(xmlHttpRequest.responseText);
        console.log(textStatus);
        console.log(errorThrown);
    }
});
return mydata;
}

// call the function with your data
latlondata = getlatlon(id);

Und wir bekommen unsere Antwort.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
Vorausschauend
quelle
URL: "getData.asmx / GetLatLon", wie ich die GetLatLon-Methode in Ihrem serverseitigen Code erwarte. Aber da ist nicht.
Lali
1

Verwendung verschlüsseln

Einfaches Objekt für JSON Array EncodeJsObjectArray ()

public class dummyObject
{
    public string fake { get; set; }
    public int id { get; set; }

    public dummyObject()
    {
        fake = "dummy";
        id = 5;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append('[');
        sb.Append(id);
        sb.Append(',');
        sb.Append(JSONEncoders.EncodeJsString(fake));
        sb.Append(']');

        return sb.ToString();
    }
}

dummyObject[] dummys = new dummyObject[2];
dummys[0] = new dummyObject();
dummys[1] = new dummyObject();

dummys[0].fake = "mike";
dummys[0].id = 29;

string result = JSONEncoders.EncodeJsObjectArray(dummys);

Ergebnis: [[29, "mike"], [5, "dummy"]]

Hübsche Verwendung

Pretty print JSON Array PrettyPrintJson () String-Erweiterungsmethode

string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]";
string result = input.PrettyPrintJson();

Ergebnisse sind:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
Sudhakar Rao
quelle