Як створити рядок JSON в C #


238

Я просто використовував XmlWriter для створення деякої XML для відправки назад у відповідь HTTP. Як би ви створили рядок JSON. Я припускаю, що ви просто використали програму stringbuilder, щоб побудувати рядок JSON, і вони форматують вашу відповідь як JSON?


Перевірте це 3 способи перетворення даних у струну JSON в Asp.net C # codepedia.info/2015/07/…
Satinder singh

Відповіді:


249

Ви можете використовувати клас JavaScriptSerializer , ознайомтеся з цією статтею щоб створити корисний метод розширення.

Код із статті:

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

Використання:

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

так, просто намагаюся розібратися, як сформувати текст JSON спочатку. Спасибі
PositiveGuy

що робити, якщо ви не використовуєте .NET 3.5! da ** it
PositiveGuy

2
JavaScriptSerializer є частиною ASP.NET Ajax 1.0, якщо ви хочете використовувати його з .NET 2.0.
Джо Чанг

2
Ви все ще можете використовувати його. Його частина ASP.NET 2.0 AJAX Extensions 1.0: asp.net/AJAX/Documentation/Live/mref / ...
Naren

наш проект може відкритись у VS 2008 ... так що він був перетворений в якийсь момент. Чи означає це, що тепер ми можемо використовувати .NET 3.5 у межах наявної бази даних?
PositiveGuy

366

Використання Newtonsoft.Json робить його справді простішим:

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

Документація: Серіалізація та десеріалізація JSON


8
MS тепер постачають NewtonSoft як стандарт у шаблоні проекту VS MVC4
Chris F Carroll

45
Ви також можете серіалізовать анонімні об'єкти при необхідності: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Метт Бекман

9
@MattBeckman Я отримую "Недійсний декларатор учасників анонімного типу. Анонімних членів типу необхідно оголосити з призначенням члена, простим ім'ям або доступом до члена. Не повинно "PropertyA"бути PropertyA?
Jonah

Тому нам потрібно реалізувати клас та об'єкти, щоб побудувати простий json! Уявіть вкладені - не фіксовані масиви - елементи. Я не бачу, чому так багато ентузіазму в повітрі!
Vassilis

6
@MattBeckman @Jonah string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });без подвійних котирувань наPropertyA.
Хосе

18

Ця бібліотека дуже хороша для JSON з C #

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


1
Дозвольте запитати, які переваги від використання цього фреймворку порівняно з саме тим допоміжним методом, про який згадував CMS вище?
PositiveGuy

1
дозволяє отримати більш точну деталізацію по json, наприклад, ви можете вказати, включати нулі чи ні, тощо.
redsquare

17

Просте використання бібліотек Newtonsoft.Json та 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"]);

Простий і зручний. Дякую.
QMaster

13

Цей фрагмент коду використовує DataContractJsonSerializer від System.Runtime.Serialization.Json в .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
Отож ... коментуйте посилання "це", щоб фактично працювати цей фрагмент. Якщо ви раніше не працювали з методами розширення, це може бути не очевидно.
Дан Еспарза

7

Погляньте на http://www.codeplex.com/json/ для проекту json-net.aspx. Навіщо заново вигадувати колесо?


3
залежно, я, можливо, не хочу покладатися на сторонній плагін з відкритим кодом просто для створення JSON. Я б скоріше створив метод string / helper.
PositiveGuy

7

Ви також можете спробувати мій ServiceStack JsonSerializer - це найшвидший серіалізатор .NET JSON на даний момент. Він підтримує серіалізацію DataContracts, будь-якого типу POCO, інтерфейсів, пізньообв'язаних об'єктів, включаючи анонімні типи тощо.

Основний приклад

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

Примітка. Використовуйте Microsofts JavaScriptSerializer лише в тому випадку, коли продуктивність для вас не важлива, оскільки мені довелося залишати її поза моїми орієнтирами, оскільки її до 40x-100x повільніше, ніж інші серіалізатори JSON.


Я спробував JsonSerializer.SerializeToString зі списком об’єктів, і він просто повернув порожній json: "[{}, {}]" pastebin.com/yEw57L3T Ось як виглядає мій об'єкт до того, як я подзвоню SerializeToString i.imgur.com/dYIE7J1.png Відповідь на це місце вгорі проголосував, але повертаючи те, що я очікував: pastebin.com/aAtB3Gxu
Метью Лок

найшвидший посилання. серіалізатора .NET JSON мертвий.

6

Якщо вам потрібен складний результат (вбудований), створіть власну структуру:

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

і тоді ви можете отримати рядок JSON з викликом

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

Результат буде таким:

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

Сподіваюся, це допомагає!


5

Якщо ви не можете або не хочете використовувати два вбудовані серіалізатори JSON ( JavaScriptSerializer і DataContractJsonSerializer ), ви можете спробувати бібліотеку JsonExSerializer - я використовую її в ряді проектів і працює досить добре.


1
Я спробував JavaScriptSerializer, і він не працює добре з нульовими об'єктами.
Лука101

1
@ Luke101: Як саме? Я маю на увазі, що я використовую його щодня і ніколи не мав проблем, тому мені чесно цікаво! (без іронії, мені дуже цікаво, тому що я жодного разу не стикався з проблемами)
Тамас Цінеге

2

Якщо ви намагаєтеся створити веб-службу для обслуговування даних через JSON на веб-сторінці, подумайте про використання інструментарію ASP.NET Ajax:

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

Він автоматично перетворить ваші об’єкти, що обслуговуються через веб-сервіс, в json, і створить клас проксі, який ви можете використовувати для підключення до нього.


це був би просто виклик до .ashx, який повертав би рядок JSON. По-перше, я просто намагаюся розібратися, як сформувати рядок .. використовуйте StringBuilder? По-друге, так, як серіалізувати. При поверненні XML ви просто встановите зміст відповіді t типу Я думаю: context.Response.ContentType = "text / xml"
PositiveGuy

1

DataContractJsonSerializer робитиме все для вас з тим же легко , як XMLSerializer. Тривіально використовувати це у веб-додатку. Якщо ви використовуєте WCF, ви можете вказати його використання за допомогою атрибута. Сімейство DataContractSerializer також дуже швидко.


1

Я виявив, що серіалізатор вам взагалі не потрібен. Якщо ви повернете об'єкт у вигляді списку. Дозвольте скористатись прикладом.

У нашому asmx ми отримуємо дані за допомогою змінної, яку ми передали разом

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

Потім за допомогою jquery ми отримуємо доступ до служби, проходячи по цій змінній.

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

І ми отримуємо свою відповідь.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}

url: "getData.asmx / GetLatLon", оскільки я очікую метод GetLatLon у коді вашого сервера. Але немає.
Лалі

1

Кодування використання

Простий об'єкт для 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);

Результат: [[29, "мікрофон"], [5, "манекен"]]

Гарне використання

Метод розширення струнки JSON Array PrettyPrintJson ()

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

Результати:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.