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?


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

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


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


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

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

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?


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.


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!


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.


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.


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.


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

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"
      ]
   ]
]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.