it-swarm.com.de

So erstellen Sie eine JSON-Zeichenfolge in C #

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.

216
PositiveGuy

Sie können die JavaScriptSerializer-Klasse , check this article verwenden, 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);
        }
    }
}

Verwendungszweck:

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();
240
CMS

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: JSON serialisieren und deserialisieren

344
Orr

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

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

18
Hugoware

Dieser Codeausschnitt verwendet den DataContractJsonSerializer aus 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());
    }
}
12
Joe Chung

Sie können auch versuchen, mein ServiceStack JsonSerializer es ist das schnellste .NET JSON-Serializer im Moment. Es unterstützt die Serialisierung von DataContracts, beliebigen 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 Microsofts 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 beträgt. langsamer als die anderen JSON-Serialisierer.

7
mythz

Schauen Sie sich http://www.codeplex.com/json/ für das Projekt json-net.aspx an. Warum das Rad neu erfinden?

7
Josh

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-Zeichenfolge 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 so aussehen:

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

Ich hoffe es hilft!

6
Subtle Fox

Wenn Sie die beiden integrierten JSON-Serializer ( JavaScriptSerializer und DataContractJsonSerializer ) nicht verwenden können oder möchten, können Sie den JsonExSerializer ausprobieren Bibliothek - Ich benutze es in einer Reihe von Projekten und funktioniert ganz gut.

5
Tamas Czinege

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"]);
4
Dr. K

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

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

2
Eduardo Scoz

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"
      ]
   ]
]
1
Sudhakar Rao

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 übergebenen Variablen

// 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 Service 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}]}
1
Prescient

Der DataContractJSONSerializer erledigt alles für Sie genauso einfach wie der XMLSerializer. Es ist trivial, dies in einer Web-App zu verwenden. Wenn Sie WCF verwenden, können Sie die Verwendung mit einem Attribut angeben. Die DataContractSerializer-Familie ist auch sehr schnell.

1
Steve