web-dev-qa-db-ja.com

JSONオブジェクトをカスタムC#オブジェクトに変換する方法

AJAX経由で渡されたJSONオブジェクトを自分のC#オブジェクトに追加する簡単な方法はありますか?

これは、JSON.stringifyを使用してページからC#WEBMETHODに渡されるJSONオブジェクトです。

{
    "user": {
        "name": "asdf",
        "teamname": "b",
        "email": "c",
        "players": ["1", "2"]
    }
}

JSONオブジェクトを受け取るC#WebMetod

[WebMethod]
public static void SaveTeam(Object user)
{

}

WebMethodに渡されるJSONオブジェクトのオブジェクト構造を表すC#クラス

public class User
{
    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}
212
MHop

C#でJSONを使用するための良い方法は JSON.NETを使うことです

クイックスタート&APIドキュメント から JSON.NET - 公式サイト がお手伝いしますそれで動作します。

使い方の例:

public class User
{
    public User(string json)
    {
        JObject jObject = JObject.Parse(json);
        JToken jUser = jObject["user"];
        name = (string) jUser["name"];
        teamname = (string) jUser["teamname"];
        email = (string) jUser["email"];
        players = jUser["players"].ToArray();
    }

    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}

// Use
private void Run()
{
    string json = @"{""user"":{""name"":""asdf"",""teamname"":""b"",""email"":""c"",""players"":[""1"",""2""]}}";
    User user = new User(json);

    Console.WriteLine("Name : " + user.name);
    Console.WriteLine("Teamname : " + user.teamname);
    Console.WriteLine("Email : " + user.email);
    Console.WriteLine("Players:");

    foreach (var player in user.players)
        Console.WriteLine(player);
 }
198
AndreyAkinshin

私たち全員が1つのライナーコードを気に入っているので

Newtonsoftは、Javaスクリプトシリアライザよりも高速です。 ...これはNewtonsoft NuGetパッケージに依存しています。このパッケージは人気があり、デフォルトのシリアライザよりも優れています。

クラスがある場合は以下を使用してください。

Mycustomclassname oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<Mycustomclassname>(jsonString);

どのクラスも動的を使用しない

var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonString);
159
MSTdev

.NET 3.5以降を使用している場合は、オプションを開いたままにしておくために、Genericsを使用してフレームワークから直接使用できるまとめた例を示します。他の人が言っているように、それが単なる単純なオブジェクトではないのであれば、本当にJSON.netを使うべきです。

public static string Serialize<T>(T obj)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string retVal = Encoding.UTF8.GetString(ms.ToArray());
    return retVal;
}

public static T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    return obj;
}

あなたは必要になるでしょう:

using System.Runtime.Serialization;

using System.Runtime.Serialization.Json;
92
Jammin

あなたのコードサンプルを考えれば、他に何もする必要はないはずです。

そのJSON文字列をWebメソッドに渡すと、自動的にJSON文字列が解析され、SaveTeamメソッドのパラメータとしてデータが格納されたUserオブジェクトが作成されます。

ただし、一般的には、以下のようにJavascriptSerializerクラスを使用することができます。より柔軟にするには、さまざまなJsonフレームワーク(Jayrock JSONが適しています)を使用して簡単にJSONを操作できます。

 JavaScriptSerializer jss= new JavaScriptSerializer();
 User user = jss.Deserialize<User>(jsonResponse); 
53
womp

もう1つの本当に簡単な解決策は、ライブラリNewtonsoft.Jsonを使用することです。

User user = JsonConvert.DeserializeObject<User>(jsonString);
37
Daniel

次の2つの例はどちらかを利用しています

  1. JavaScriptSerializerの下System.Web.Script.Serializationまたは
  2. Json.DecodeSystem.Web.Helpers

例1:System.Web.Script.Serializationを使った

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Script.Serialization;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void Test()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            dynamic jsonObject = serializer.Deserialize<dynamic>(json);

            dynamic x = jsonObject["user"]; // result is Dictionary<string,object> user with fields name, teamname, email and players with their values
            x = jsonObject["user"]["name"]; // result is asdf
            x = jsonObject["user"]["players"]; // result is object[] players with its values
        }
    }
}

使用法:JSONオブジェクトからカスタムC#オブジェクトへ

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Script.Serialization;
using System.Linq;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJavaScriptSerializer()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            User user = new User(json);
            Console.WriteLine("Name : " + user.name);
            Console.WriteLine("Teamname : " + user.teamname);
            Console.WriteLine("Email : " + user.email);
            Console.WriteLine("Players:");
            foreach (var player in user.players)
                Console.WriteLine(player);
        }
    }

    public class User {
        public User(string json) {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            var jsonObject = serializer.Deserialize<dynamic>(json);
            name = (string)jsonObject["user"]["name"];
            teamname = (string)jsonObject["user"]["teamname"];
            email = (string)jsonObject["user"]["email"];
            players = jsonObject["user"]["players"];
        }

        public string name { get; set; }
        public string teamname { get; set; }
        public string email { get; set; }
        public Array players { get; set; }
    }
}

例2:System.Web.Helpersを使った

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Helpers;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJsonDecode()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            dynamic jsonObject = Json.Decode(json);

            dynamic x = jsonObject.user; // result is dynamic json object user with fields name, teamname, email and players with their values
            x = jsonObject.user.name; // result is asdf
            x = jsonObject.user.players; // result is dynamic json array players with its values
        }
    }
}

使用法:JSONオブジェクトからカスタムC#オブジェクトへ

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Helpers;
using System.Linq;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJsonDecode()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            User user = new User(json);
            Console.WriteLine("Name : " + user.name);
            Console.WriteLine("Teamname : " + user.teamname);
            Console.WriteLine("Email : " + user.email);
            Console.WriteLine("Players:");
            foreach (var player in user.players)
                Console.WriteLine(player);
        }
    }

    public class User {
        public User(string json) {
            var jsonObject = Json.Decode(json);
            name = (string)jsonObject.user.name;
            teamname = (string)jsonObject.user.teamname;
            email = (string)jsonObject.user.email;
            players = (DynamicJsonArray) jsonObject.user.players;
        }

        public string name { get; set; }
        public string teamname { get; set; }
        public string email { get; set; }
        public Array players { get; set; }
    }
}

このコードでは、System.Web.Helpers名前空間を追加する必要があります。

%ProgramFiles%\ Microsoft ASP.NET\ASP.NET Webページ{バージョン}\Assemblies\System.Web.Helpers.dll

または

%ProgramFiles(x86)%\ Microsoft ASP.NET\ASP.NET Webページ{バージョン}\Assemblies\System.Web.Helpers.dll

お役に立てれば!

31
user677607
public static class Utilities
{
    public static T Deserialize<T>(string jsonString)
    {
        using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
        {    
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            return (T)serializer.ReadObject(ms);
        }
    }
}

詳細については、次のリンクに移動してください http://ishareidea.blogspot.in/2012/05/json-conversion.html

DataContractJsonSerializer Classについてはこちら を読むことができます

7
Syam Developer

JavaScriptSerializer()の使用は、提供されている一般的なソリューションよりも厳密ではありません。public static T Deserialize(string json)

あなたが変換しようとしているオブジェクト定義と正確に一致しないjsonをサーバーに渡すとき、それは便利になるかもしれません。

5
Ioannis Suarez

性能的には、ServiceStackのシリアライザは他のものよりも少し速いことがわかりました。 ServiceStack.Text名前空間のJsonSerializerクラスです。

https://github.com/ServiceStack/ServiceStack.Text

ServiceStackはNuGetパッケージから入手できます。 https://www.nuget.org/packages/ServiceStack/

2
akazemis

JSON.Netが最善の策ですが、オブジェクトの形状や循環依存関係があるかどうかに応じて、JavaScriptSerializerまたはDataContractSerializerを使用できます。

1
Sky Sanders

JavaScriptシリアライザ:using System.Web.Script.Serialization;が必要

public class JavaScriptSerializerDeSerializer<T>
{
    private readonly JavaScriptSerializer serializer;

    public JavaScriptSerializerDeSerializer()
    {
        this.serializer = new JavaScriptSerializer();
    }

    public string Serialize(T t)
    {
        return this.serializer.Serialize(t);
    }

    public T Deseralize(string stringObject)
    {
        return this.serializer.Deserialize<T>(stringObject);
    }
}

データコントラクトシリアライザ:using System.Runtime.Serialization.Json;が必要 - ジェネリック型Tはシリアライズ可能であるべきです もっとデータコントラクトについて

public class JsonSerializerDeserializer<T> where T : class
{
    private readonly DataContractJsonSerializer jsonSerializer;

    public JsonSerializerDeserializer()
    {
        this.jsonSerializer = new DataContractJsonSerializer(typeof(T));
    }

    public string Serialize(T t)
    {
        using (var memoryStream = new MemoryStream())
        {
            this.jsonSerializer.WriteObject(memoryStream, t);
            memoryStream.Position = 0;
            using (var sr = new StreamReader(memoryStream))
            {
                return sr.ReadToEnd();
            }
        }
    }

    public T Deserialize(string objectString)
    {
        using (var ms = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes((objectString))))
        {
            return (T)this.jsonSerializer.ReadObject(ms);
        }
    }
}
1
BTE

コードプレックス上の JSON C#クラスジェネレータ はNewtonSoftJSでうまく動作するクラスを生成します。

1
ΩmegaMan

単なるオブジェクトとして送信するのではなく。

アクセス可能なパブリッククラスのプロパティを作成し、そのデータをWebメソッドに送信します。

[WebMethod]
public static void SaveTeam(useSomeClassHere user)
{
}

ajax呼び出しで同じパラメーター名を使用してデータを送信してください。