কীভাবে JSON অবজেক্টটি কাস্টম সি # অবজেক্টে রূপান্তর করবেন?


247

আমার সি # অবজেক্টটি এজেএক্স দিয়ে যাওয়া JSON অবজেক্টের সাথে পপুলেট করার কোনও সহজ উপায় আছে?

এটি JSON.stringify ব্যবহার করে পৃষ্ঠা থেকে সি # WEBMETHOD এ পাস করা JSON অবজেক্ট

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

সি # ওয়েবমেটড যা জেএসএন অবজেক্ট গ্রহণ করে

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

}

সি # ক্লাস যা জেএসএন অবজেক্টের অবজেক্ট স্ট্রাকচারের প্রতিনিধিত্ব করে ওয়েবমেথোডে পাস করেছে

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

69
আপনি যুক্ত করতে চান যে আপনি নিজের জন্য # সি ক্লাস তৈরি করতে আপনি json2csharp.com ব্যবহার করতে পারেন । সম্পূর্ণ প্রকাশ: আমি এই সাইটটি তৈরি করেছি।
জোনাথ্যাঙ্ক


@ জনাথনকে আপনি আমার ত্রাণকর্তা!
মাথেনো

উত্তর:


218

সি # তে জেএসএন ব্যবহার করার একটি ভাল উপায় হ'ল জেএসওএন.নেট

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

5
এটি একটি চ্যাম্পের মতো কাজ করে তবে আমার জসনটিতে যদি আমার একাধিক আইটেম থাকে এবং আমি কোনও অবজেক্টের তালিকা তৈরি করতে চাই তবে কী হবে?
জিরোইন

@ জিরোইন: আমি এর দুটি উপায় দেখতে পাচ্ছি। আইটেমগুলি গোষ্ঠীভুক্ত না হলে স্ট্রিংকে বিভক্ত করার একটি উপায় অনুসন্ধান করার চেষ্টা করুন একটি লুপে পুনরায় প্রক্রিয়াটি পুনরায় করুন। যদি তাদের গোষ্ঠীবদ্ধ করা হয় তবে কোনও বস্তু তৈরি করুন
ব্যবহারকারীর 1111138

1
আমি অন্যান্য উত্তরে উল্লিখিত একটি রেখাকে পছন্দ করি .. আইএমএইচও।
রায়লভলেস

হ্যাঁ এটি একটি দুর্দান্ত পদ্ধতির নয়, নীচে DeserializeObject ব্যবহার করা খুব ক্লিনার
অ্যান্ড্রু

208

যেহেতু আমরা সকলেই একটি লাইনার কোড পছন্দ করি

জাভা স্ক্রিপ্ট সিরিয়ালাইজের চেয়ে নিউটনসফট দ্রুত। ... এটি নিউটসনফট নুগেট প্যাকেজের উপর নির্ভর করে যা ডিফল্ট সিরিয়ালাইজারের চেয়ে জনপ্রিয় এবং উন্নত।

যদি আমাদের ক্লাস থাকে তবে নীচে ব্যবহার করুন।

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

কোনও শ্রেণি তখন গতিশীল ব্যবহার করে না

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

95

আপনার বিকল্পগুলি উন্মুক্ত রাখতে, আপনি .NET 3.5 বা তার পরে ব্যবহার করছেন তবে এখানে জড়িত উদাহরণস্বরূপ আপনি জেনেরিক্স ব্যবহার করে ফ্রেমওয়ার্ক থেকে সরাসরি ব্যবহার করতে পারেন। অন্যরা যেমন উল্লেখ করেছে, এটি যদি কেবল সাধারণ অবজেক্ট না হয় তবে আপনার সত্যিই 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;

@ ক্রিশ্চিয়ান পেয়েন হা! ভাল কথা, হ্যাঁ এগুলি আবৃত করা উচিত। এই দৃষ্টি আকর্ষণ করে, কেবল JSON.NET ব্যবহার করুন!
জামমিন

2
যদি ডেটা কন্ট্রাক্টজসনসিরালাইজার ক্লাসটি দৃশ্যমান না হয়, তবে আপনাকে সমাধানের রেফারেন্সগুলিতে ডান ক্লিক করে সিস্টেম.রুনটাইম.সিরিয়ালাইজেশনের একটি রেফারেন্স যুক্ত করতে হবে, .NET ট্যাবটি নির্বাচন করুন এবং
সিস্টেমটি.আরটাইম.সরিয়ালাইজেশন

1
একটি দৃশ্য যেখানে এটি বিরতি দেয়। যদি আপনার JSON অবজেক্টটি একক উদ্ধৃতি সহ বৈশিষ্ট্য উপস্থাপন করে তবে এই ফাংশনটি ব্যর্থ। উদাহরণস্বরূপ এটি Sub 'বিষয়': পার্সিং করতে সক্ষম ছিল না: 'ইমেলিং: ওয়েব ব্যবহারকারীর ক্রিয়াকলাপ লগ 11', 'এম্বেডআসআইমেজ': সত্য} তবে এটি Sub "বিষয়": "ইমেলিং: ওয়েব ব্যবহারকারীর ক্রিয়াকলাপ লগ 11", "এম্বেডএমেজেশন" পার্স করতে সক্ষম হয়েছিল : সত্য}
স্বপ্নেরকুমার

প্লাস আমার ডেটা কন্ট্রাক্ট এবং ডেটা মেম্বার বৈশিষ্ট্যগুলির সাথে আমার সাধারণ ক্লাসটি সজ্জিত করা দরকার। এটি ছাড়া পার্স করা হবে না।
dreamerkumar

বিশালের বিপরীতে, একটি পোকো ক্লাস আমার জন্য পুরোপুরি কাজ করেছে ... +1 কারণ এটি JSON.NET এর উপর নির্ভরতা এড়ায়।
ডান্ক

54

আপনার কোডের নমুনা দেওয়া, আপনার আর কিছু করার দরকার নেই।

যদি আপনি সেই JSON স্ট্রিংটি আপনার ওয়েব পদ্ধতিতে পাস করেন তবে এটি স্বয়ংক্রিয়ভাবে JSON স্ট্রিংকে বিশ্লেষণ করবে এবং আপনার সেভটিম পদ্ধতির প্যারামিটার হিসাবে একটি পপুলেটেড ইউজার অবজেক্ট তৈরি করবে।

সাধারণত, আপনি JavascriptSerializerক্লাসটি নীচের হিসাবে ব্যবহার করতে পারেন , বা আরও নমনীয়তার জন্য, সহজে জেএসএন হেরফেরের জন্য বিভিন্ন জসন ফ্রেমওয়ার্ক ব্যবহার করতে পারেন (জেইরক জেএসওন একটি ভাল)।

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

1
আমি মনে করি আপনাকে অবশ্যই একটি অণুগুণযোগ্য টাইপ ব্যবহার করতে হবে (সুতরাং এই উদাহরণে <ব্যবহারকারীর তালিকাতে)
ড্র্যাগউফ

এতে যদি উপ-দর্শন মডেল থাকে
শ্রীনিবাসনায়েডু

1
যারা খুঁজছেন তাদের আপনার কাছে সমাবেশটি উল্লেখ করতে হবে System.Web.Extensionsএবং এর জন্য একটি যোগ using System.Web.Script.Serializationকরতে হবে JavaScriptSerializer, তবে একবার আপনি এটি করার পরে, এটি আপনার সিটিকে jsonকংক্রিটের ক্লাসগুলিতে বিশ্লেষণ করার সবচেয়ে পরিষ্কার উপায় বলে মনে হচ্ছে ।
সেরজ সাগান

41

আর একটি সত্যই সরল সমাধান লাইব্রেরি ব্যবহার করছে নিউটনসফট.জসন:

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

তবে ব্যবহারকারীর অবজেক্টটিতে সম্পত্তিটিতে আরও একটি জেএসন ডেটা থাকলে, এটি ব্যর্থ হবে ...
gumuruh

@ গুমুরুহ আমার ধারণা আমি আপনার বক্তব্যটি বুঝতে পারি নি। আপনার যদি কোনও জটিল অবজেক্টের জাদুকরী বৈশিষ্ট্য থাকে তবে আরও একটি জটিল বস্তু, সেগুলিও রূপান্তরিত হবে, যতক্ষণ না আপনার জসন স্ট্রিংয়ের ডেটা সঠিকভাবে থাকে।
ড্যানিয়েল

33

নিম্নলিখিত 2 টি উদাহরণ দুটি ব্যবহার করে

  1. System.Web.Script.Serialization বা এর অধীনে জাভাস্ক্রিপ্টসরিয়ালাইজার
  2. System.Web.Helpers এর অধীনে Json.Decode

উদাহরণ 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
        }
    }
}

ব্যবহার: কাস্টম সি # অবজেক্টে জেএসওএন অবজেক্ট

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

ব্যবহার: কাস্টম সি # অবজেক্টে জেএসওএন অবজেক্ট

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

এই কোডটির জন্য সিস্টেম যোগ করা দরকার e

% প্রোগ্রামফল%% মাইক্রোসফ্ট ASP.NET \ ASP.NET ওয়েব পৃষ্ঠা {সংস্করণ \ সমাবেশগুলি \ System.Web.Helpers.dll

অথবা

% প্রোগ্রামফায়ালস (x86)% \ মাইক্রোসফ্ট এএসপি.নেট \ এএসপি.নেট ওয়েব পৃষ্ঠাগুলি ERS সংস্করণ \ সমাবেশগুলি \ সিস্টেম. ওয়েবে.হেল্পার্স.ডিএল

আশাকরি এটা সাহায্য করবে!


এটি একটি খুব ভাল উত্তর, তবে কৌতূহলোদ্দীপক বিষয়টি হ'ল dynamicপ্রকারের সাথে আপনি কোনও প্রকৃত ধরণের চেকিং পান না। উদাহরণস্বরূপ, যদি আপনার JSON এ থাকে "Name" : "Ahmed"এবং আপনি যদি আপনার সি # কোডে "নাম" ভুল টাইপ করেন তবে এটি একটি রানটাইম ত্রুটি (দোষ)।
জেস

ধন্যবাদ! দয়া করে উত্তরটি আপডেট করুন যে উদাহরণ 1 এর জন্য আপনাকে সিস্টেম.ওয়েব.এক্সটেনশনস.ডিল
ভ্যালামাস

1
দুর্দান্ত দুর্দান্ত উত্তর, ডায়নামিক টাইপিং w / json.net v6.0.6 এও কাজ করে!
stackuser83

7
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আপনি এখানে পড়তে পারেন সম্পর্কে ।


5

জাভাস্ক্রিপ্টসরিশালাইজার () ব্যবহার করা জেনেরিক সমাধানের চেয়ে কম কঠোর: জনসাধারণের স্ট্যাটিক টি ডিসরিওলাইজ (স্ট্রিং জেসন)

আপনি যখন রূপান্তর করতে চাইছেন সেই অবজেক্ট সংজ্ঞাটির সাথে মেলে না এমন সার্ভারে জেসন পাস করার সময় এটি কার্যকর হতে পারে।


2

পারফরম্যান্স অনুযায়ী, আমি সার্ভিস স্ট্যাকের সিরিয়ালাইজারটি অন্যদের চেয়ে কিছুটা দ্রুত পেয়েছি। এটি সার্ভিসস্ট্যাকের টেক্সট নেমস্পেসের জসনসিরাইজার ক্লাস।

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

সার্ভিস স্ট্যাকটি নুগেট প্যাকেজের মাধ্যমে উপলব্ধ: https://www.nuget.org/packages/ServiceStack/


1

JSON.Net আপনার সেরা বাজি তবে বস্তুর আকারের উপর নির্ভর করে এবং বিজ্ঞপ্তি নির্ভরতা রয়েছে কি না, আপনি জাভাস্ক্রিপ্টসরিয়ালাইজার বা ডেটা কন্ট্র্যাক্টসরিয়ালাইজার ব্যবহার করতে পারেন।



1

জাভাস্ক্রিপ্ট সিরিয়ালাইজার: প্রয়োজন 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; - জেনেরিক টাইপ টি ডেটা চুক্তিতে আরও সিরিয়ালযোগ্য হওয়া উচিত serial

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

0

বরং কেবল একটি বিষয় হিসাবে প্রেরণ।

অ্যাক্সেসযোগ্য বৈশিষ্ট্যগুলির একটি সর্বজনীন শ্রেণি তৈরি করুন এবং ডেটা ওয়েবমেডথকে প্রেরণ করুন।

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

ডেটা প্রেরণের জন্য এজাক্স কলে একই পরামিতিগুলির নাম ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.