C#でJSON文字列を作成する方法


238

XmlWriterを使用してXMLを作成し、HTTP応答で返信しました。どのようにJSON文字列を作成しますか?文字列ビルダーを使用してJSON文字列を作成し、応答をJSONとしてフォーマットすると思いますか?


Asp.netでデータをJSON文字列に変換する3つの方法を確認するC#codepedia.info
2015/07/

回答:


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は、.NET 2.0から使用する場合、ASP.NET Ajax 1.0の一部です。
Joe Chung、

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は、VS MVC4プロジェクトテンプレートの標準としてNewtonSoftを出荷します
Chris F Carroll

45
必要に応じて、匿名オブジェクトをシリアル化することもできますstring json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });
Matt Beckman

9
@MattBeckman私は「無効な匿名型のメンバ宣言子を取得する匿名型メンバーは、メンバーの割り当て、単純名またはメンバのアクセスで宣言されなければならないべきではない。"PropertyA"可能PropertyA
ヨナ

したがって、単純なjsonを構築するには、クラスとオブジェクトを実装する必要があります。ネストされた-固定されていない配列-要素を想像してください。なぜそんなに熱狂しているのかわからない!
Vassilis 2017

6
@MattBeckman @Jonahがあるstring json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });上、二重引用符なしPropertyA.
ホセ


17

Simlpe使用Newtonsoft.JsonNewtonsoft.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

このコードスニペットでは、.NET 3.5のSystem.Runtime.Serialization.JsonのDataContractJsonSerializerを使用しています。

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
したがって、実際にこのスニペットを機能させるには、「this」参照のコメントを外してください。以前に拡張メソッドを使用したことがない場合、これは明らかではない可能性があります。
Dan Esparza、

7

json-net.aspxプロジェクトについては、http://www.codeplex.com/json/ご覧ください。なぜ車輪を再発明するのですか?


3
場合によっては、JSONを作成するためだけにサードパーティのオープンソースプラグインに依存したくない場合があります。文字列/ヘルパーメソッドを自分で作成したい。
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); 

注:他のJSON シリアライザーよりも最大で40倍から100倍遅いため、ベンチマークから除外する必要があったため、パフォーマンスが重要でない場合にのみ、MicrosoftのJavaScript シリアライザーを使用してください。


私は、オブジェクトのリストでJsonSerializer.SerializeToStringを試してみましたが、それだけで、空のJSONが返されました:「[{}、{}]」pastebin.com/yEw57L3Tは、 ここで私はSerializeToString呼び出す前に、どのような私のオブジェクトに見えるようだi.imgur.com/dYIE7J1.pngここでトップ投票の回答が機能しましたが、私が期待したものを返しました:pastebin.com/aAtB3Gxu
Matthew Lock

最速の.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

2つの組み込みJSON シリアライザーJavaScriptSerializerDataContractJsonSerializer)を使用できない場合、または使用したくない場合は、JsonExSerializerライブラリを試すことができます-私はいくつかのプロジェクトで使用しており、非常にうまく機能しています。


1
JavaScriptSerializerを試してみましたが、nullオブジェクトではうまく機能しません。
Luke101

1
@ Luke101:正確には?私は毎日それを使用していて、問題がなかったので、正直に気になります!(皮肉はありません。問題に遭遇したことがないので、私は本当に興味があります)
Tamas Czinege

2

JSONを介してWebページにデータを提供するWebサービスを作成する場合は、ASP.NET Ajaxツールキットの使用を検討してください。

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

Webサービスを介して提供されるオブジェクトを自動的にjsonに変換し、それに接続するために使用できるプロキシクラスを作成します。


JSONの文字列を返す.ashxを呼び出すだけです。最初に、文字列の作成方法を理解しようとしています。StringBuilderを使用しますか?次に、はい、シリアル化する方法。XMLを返すときは、応答のコンテンツタイプを設定するだけだと思います。context.Response.ContentType= "text / xml"
PositiveGuy

1

DataContractJSONSerializerは XmlSerializerを同じと簡単にあなたのために全力を尽くします。これをWebアプリで使用するのは簡単です。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メソッドを期待しています。しかし、ありません。
Lali、2014

1

エンコードの使用

JSON配列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、 "mike"]、[5、 "dummy"]]

かなりの使い方

PrettyプリントJSON配列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"
      ]
   ]
]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.