Jak utworzyć ciąg JSON w C #

238

Właśnie użyłem XmlWriter, aby utworzyć XML, aby odesłać odpowiedź HTTP. Jak utworzysz ciąg JSON. Zakładam, że użyjesz konstruktora ciągów do zbudowania ciągu JSON i sformatują twoją odpowiedź jako JSON?

PositiveGuy
źródło
Sprawdź to 3 sposoby konwersji danych do JSON String w Asp.net C # codepedia.info/2015/07/…
Satinder singh

Odpowiedzi:

249

Możesz użyć klasy JavaScriptSerializer , sprawdź ten artykuł, aby zbudować przydatną metodę rozszerzenia.

Kod z artykułu:

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);
        }
    }
}

Stosowanie:

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
źródło
tak, najpierw próbuję dowiedzieć się, jak utworzyć tekst JSON. Dzięki
PositiveGuy
co jeśli nie używasz .NET 3.5! da ** it
PositiveGuy
2
JavaScriptSerializer jest częścią ASP.NET Ajax 1.0, jeśli chcesz go używać z .NET 2.0.
Joe Chung
2
Nadal możesz z niego korzystać. Jest częścią rozszerzenia AJAX ASP.NET 2.0 1.0: asp.net/AJAX/Documentation/Live/mref/…
Naren
nasz projekt można otworzyć w VS 2008 ... więc w pewnym momencie został przekonwertowany. Czy to oznacza, że ​​możemy teraz korzystać z .NET 3.5 w ramach naszej istniejącej bazy kodów?
PositiveGuy
366

Korzystanie z Newtonsoft.Json sprawia, że ​​jest to naprawdę łatwiejsze:

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);

Dokumentacja: Serializacja i deserializacja JSON

Orr
źródło
8
MS wysyła teraz NewtonSoft jako standard w szablonie projektu VS MVC4
Chris F Carroll
45
Można również serializacji obiektów anonimowych razie potrzeby: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman
9
@MattBeckman Dostaję „Nieprawidłowy deklarator członka typu anonimowego. Członkowie typu anonimowego muszą zostać zadeklarowani przy użyciu przypisania członka, prostej nazwy lub dostępu do członka. Nie powinno "PropertyA"być PropertyA?
Jonah
Musimy więc zaimplementować klasę i obiekty, aby zbudować prosty json! Wyobraź sobie zagnieżdżone - nie ustalone tablice - elementy. Nie rozumiem, dlaczego tyle entuzjazmu w powietrzu!
Vassilis,
6
@MattBeckman @Jonah string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });nie ma podwójnych cytatów naPropertyA.
Jose
18

Ta biblioteka jest bardzo dobra dla JSON z C #

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

Hugoware
źródło
1
Pozwól, że zapytam, jakie są zalety korzystania z tego frameworka w porównaniu z tą metodą pomocniczą, o której wspominał CMS powyżej?
PositiveGuy
1
pozwala na dokładniejszą ziarnistość w stosunku do JSON, np. możesz określić, czy chcesz
wstawić
17

Łatwe korzystanie z bibliotek Newtonsoft.Json i 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.
źródło
Prosty i poręczny. Dzięki.
QMaster
13

Ten fragment kodu używa DataContractJsonSerializer z System.Runtime.Serialization.Json w .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
źródło
3
Więc ... odkomentuj odniesienie „to”, aby faktycznie uruchomić ten fragment kodu. Jeśli wcześniej nie pracowałeś z metodami rozszerzenia, może to nie być oczywiste.
Dan Esparza
7

Zajrzyj na stronę http://www.codeplex.com/json/, aby zapoznać się z projektem json-net.aspx. Po co ponownie wymyślać koło?

Josh
źródło
3
zależy, może nie chcę polegać na wtyczce open source innej firmy tylko do tworzenia JSON. Wolę sam stworzyć metodę string / helper.
PositiveGuy
7

Możesz także wypróbować mój ServiceStack JsonSerializer, który jest najszybszym serializatorem .NET JSON w tej chwili. Obsługuje serializację danych, dowolnych typów POCO, interfejsów, obiektów z późnymi powiązaniami, w tym typów anonimowych itp.

Podstawowy przykład

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

Uwaga: używaj Microsofts JavaScriptSerializer tylko wtedy, gdy wydajność nie jest dla Ciebie ważna, ponieważ musiałem pominąć ją w testach porównawczych, ponieważ jest do 40x-100x wolniejszy niż inne serializatory JSON.

mit
źródło
Próbowałem JsonSerializer.SerializeToString z listą obiektów i właśnie zwróciło puste json: "[{}, {}]" pastebin.com/yEw57L3T Oto jak wygląda mój obiekt przed wywołaniem SerializeToString i.imgur.com/dYIE7J1.png Najlepsza głosowana odpowiedź tutaj zadziałała, zwracając to, czego się spodziewałem: pastebin.com/aAtB3Gxu
Matthew Lock
najszybszy link serializatora .NET JSON nie działa.
6

Jeśli potrzebujesz złożonego wyniku (osadzonego), stwórz własną 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;
        }                
    };
}

a następnie można uzyskać ciąg JSON z wywołaniem

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);

Wynik będzie taki:

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

Mam nadzieję, że to pomoże!

Subtelny Lis
źródło
5

Jeśli nie możesz lub nie chcesz używać dwóch wbudowanych serializatorów JSON ( JavaScriptSerializer i DataContractJsonSerializer ), możesz wypróbować bibliotekę JsonExSerializer - używam jej w wielu projektach i działa całkiem dobrze.

Tamas Czinege
źródło
1
próbowałem JavaScriptSerializer i nie działa dobrze z zerowymi obiektami.
Luke101
1
@ Luke101: Jak dokładnie? Mam na myśli, że używam go codziennie i nigdy nie miałem problemów, więc jestem szczerze ciekawy! (bez ironii, jestem naprawdę ciekawy, ponieważ nigdy nie napotkałem problemów)
Tamas Czinege
2

Jeśli próbujesz utworzyć usługę sieci Web do obsługi danych przez JSON na stronie internetowej, rozważ użycie zestawu narzędzi ASP.NET Ajax:

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

Automatycznie skonwertuje twoje obiekty obsługiwane przez usługę internetową na json i utworzy klasę proxy, której możesz użyć do połączenia się z nią.

Eduardo Scoz
źródło
byłoby to po prostu wywołanie pliku .ashx, który zwróciłby ciąg JSON. Po pierwsze, próbuję wymyślić, jak utworzyć ciąg .. użyć StringBuilder? Po drugie, tak, jak serializować. Zwracając XML, po prostu ustawiam typ zawartości odpowiedzi, myślę: context.Response.ContentType = "text / xml"
PositiveGuy
1

DataContractJSONSerializer zrobi wszystko dla Ciebie z tym samym łatwe jak XMLSerializer. Używanie tego w aplikacji internetowej jest banalne. Jeśli używasz WCF, możesz określić jego użycie za pomocą atrybutu. Rodzina DataContractSerializer jest również bardzo szybka.

Steve
źródło
1

Przekonałem się, że w ogóle nie potrzebujesz serializatora. Jeśli zwrócisz obiekt jako listę. Pozwól mi skorzystać z przykładu.

W naszym asmx otrzymujemy dane przy użyciu zmiennej, którą przekazaliśmy

// 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; }
}

Następnie za pomocą jquery uzyskujemy dostęp do usługi, przekazując tę ​​zmienną.

// 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);

I otrzymujemy naszą odpowiedź.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
Przewidujący
źródło
url: „getData.asmx / GetLatLon”, tak jak oczekuję metody GetLatLon w kodzie serwera. Ale nie ma.
Lali
1

Zakoduj użycie

Prosty obiekt do 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);

Wynik: [[29, „mike”], [5, „dummy”]]

Ładne użycie

Pretty print Metoda rozszerzenia ciągu JSON Array PrettyPrintJson ()

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

Wyniki to:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
Sudhakar Rao
źródło