Como criar uma string JSON em c #

238

Eu apenas usei o XmlWriter para criar um XML para enviar de volta em uma resposta HTTP. Como você criaria uma string JSON. Suponho que você usaria apenas um construtor de string para criar a string JSON e eles formatariam sua resposta como JSON?

PositiveGuy
fonte
Verifique isso 3 maneiras converter dados para JSON de Cordas em Asp.net C # codepedia.info/2015/07/...
Satinder singh

Respostas:

249

Você pode usar a classe JavaScriptSerializer , consulte este artigo para criar um método de extensão útil.

Código do artigo:

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

Uso:

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
fonte
sim, apenas tentando descobrir como formar o texto JSON primeiro. Obrigado
PositiveGuy
e se você não estiver usando o .NET 3.5! da ** it
PositiveGuy
2
JavaScriptSerializer faz parte do ASP.NET Ajax 1.0 se você quiser usá-lo no .NET 2.0.
Joe Chung
2
Você ainda pode usá-lo. Sua parte do ASP.NET 2.0 AJAX Extensions 1.0: asp.net/AJAX/Documentation/Live/mref/...
Naren
nosso projeto pode ser aberto no VS 2008 ... então foi convertido em algum momento. Isso significa que agora podemos usar o .NET 3.5 em nossa base de código existente?
PositiveGuy
366

O uso do Newtonsoft.Json facilita muito:

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

Documentação: JSON serializando e desserializando

Orr
fonte
8
MS agora enviar NewtonSoft como padrão no modelo de projeto VS MVC4
Chris F Carroll
45
Você também pode serializar objetos anônimos quando necessário: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman
9
. @MattBeckman eu recebo "membros inválido anônimo membro do tipo declarator tipo anônimo deve ser declarado com uma atribuição de membro, nome simples ou acesso membro não deveria. "PropertyA"Ser PropertyA?
Jonah
Então, precisamos implementar uma classe e objetos, para construir um simples json! Imagine elementos aninhados - não matrizes fixas -. Não vejo por que tanto entusiasmo no ar!
Vassilis
6
@MattBeckman @Jonah é string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });sem aspas duplas emPropertyA.
Jose
18

Essa biblioteca é muito boa para JSON de C #

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

Hugoware
fonte
1
Deixe-me perguntar, quais são os benefícios de usar essa estrutura versus apenas o método auxiliar mencionado pelo CMS acima?
PositiveGuy
1
permite maior granularidade sobre o JSON por exemplo, você pode especificar para incluir valores nulos ou não etc
redsquare
17

Uso simlpe de Newtonsoft.Json e Newtonsoft.Json.Linq bibliotecas.

        //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
fonte
Simples e prático. Obrigado.
QMaster 27/04
13

Este trecho de código usa o DataContractJsonSerializer de System.Runtime.Serialization.Json no .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
fonte
3
Então ... descomente a referência 'this' para realmente fazer esse snippet funcionar. Se você não trabalhou com métodos de extensão antes, isso pode não ser óbvio.
9119 Dan Esparza
7

Dê uma olhada em http://www.codeplex.com/json/ para o projeto json-net.aspx. Por que reinventar a roda?

Josh
fonte
3
depende, talvez eu não queira confiar em um plug-in de código aberto de terceiros apenas para criar JSON. Prefiro criar o método string / helper sozinho.
PositiveGuy
7

Você também pode experimentar o meu ServiceStack JsonSerializer, que é o serializador .NET JSON mais rápido no momento. Ele suporta serialização de DataContracts, qualquer tipo de POCO, interfaces, objetos de ligação tardia, incluindo tipos anônimos, etc.

Exemplo básico

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

Nota: Use o Microsofts JavaScriptSerializer apenas se o desempenho não for importante para você, pois tive que deixá-lo fora dos meus benchmarks, pois é até 40x-100x mais lento que os outros serializadores JSON.

mythz
fonte
Tentei o JsonSerializer.SerializeToString com uma lista de objetos e ele retornou json vazio: "[{}, {}]" pastebin.com/yEw57L3T Aqui está a aparência do meu objeto antes de eu chamar SerializeToString i.imgur.com/dYIE7J1.png o topo votou resposta aqui trabalhado, apesar de, retornando o que eu esperava: pastebin.com/aAtB3Gxu
Matthew Bloqueio
O link mais rápido do serializador .NET JSON está inoperante.
6

Se você precisar de resultados complexos (incorporados), crie sua própria estrutura:

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

e então você pode obter a string JSON chamando

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

O resultado será assim:

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

Espero que ajude!

Subtle Fox
fonte
5

Se você não pode ou não deseja usar os dois serializadores JSON internos ( JavaScriptSerializer e DataContractJsonSerializer ), pode tentar a biblioteca JsonExSerializer - eu a uso em vários projetos e funciona muito bem.

Tamas Czinege
fonte
1
Eu tentei o JavaScriptSerializer e ele não funciona bem com objetos nulos.
Luke101
1
@ Luke101: Como exatamente? Quero dizer, uso todos os dias e nunca tive problemas, por isso estou sinceramente curioso! (sem ironia, eu estou realmente curioso, porque eu nunca encontrou problemas)
Tamas Czinege
2

Se você estiver tentando criar um serviço da Web para veicular dados sobre JSON em uma página da Web, considere usar o kit de ferramentas do ASP.NET Ajax:

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

Ele converterá automaticamente seus objetos servidos em um serviço da web em json e criará a classe de proxy que você pode usar para conectar-se a ele.

Eduardo Scoz
fonte
seria apenas uma chamada para um .ashx que retornaria uma sequência de JSON. Primeiro, estou apenas tentando descobrir como formar a string ... use um StringBuilder? Segundo, sim, como serializar. Ao retornar XML você apenas definir o da resposta conten t digitar penso: context.Response.ContentType = "text / xml"
PositiveGuy
1

O DataContractJSONSerializer fará tudo por você da mesma forma que o XMLSerializer. É trivial usar isso em um aplicativo da web. Se você estiver usando o WCF, poderá especificar seu uso com um atributo A família DataContractSerializer também é muito rápida.

Steve
fonte
1

Descobri que você não precisa do serializador. Se você retornar o objeto como uma lista. Deixe-me usar um exemplo.

Em nosso asmx, obtemos os dados usando a variável que transmitimos

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

Em seguida, usando jquery, acessamos o serviço, repassando essa variável.

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

E obtemos nossa resposta.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
Presciente
fonte
url: "getData.asmx / GetLatLon", como espero o método GetLatLon no código do lado do servidor. Mas não existe.
Lali
1

Codificar uso

Objeto simples para 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);

Resultado: [[29, "microfone"], [5, "manequim"]]

Uso bonito

Método de extensão de string PrettyPrintJson () de JSON Array de impressão bonita

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

Os resultados são:

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