সি # ব্যবহার করে .NET এ আমি কীভাবে JSON ফর্ম্যাট করব?


254

আমি। নেট জেএসওন পার্সার ব্যবহার করছি এবং আমার কনফিগারেশন ফাইলটি সিরিয়ালাইজ করতে চাই যাতে এটি পঠনযোগ্য। এর পরিবর্তে:

{"blah":"v", "blah2":"v2"}

আমি ভালো কিছু চাই:

{
    "blah":"v", 
    "blah2":"v2"
}

আমার কোডটি এরকম কিছু:

using System.Web.Script.Serialization; 

var ser = new JavaScriptSerializer();
configSz = ser.Serialize(config);
using (var f = (TextWriter)File.CreateText(configFn))
{
    f.WriteLine(configSz);
    f.Close();
}

উত্তর:


257

জাভাস্ক্রিপ্টসরিয়ালাইজারের সাহায্যে এটি সম্পাদন করতে আপনার খুব কষ্ট হতে চলেছে।

ব্যবহার করে দেখুন JSON.Net

JSON.Net উদাহরণ থেকে ছোটখাট পরিবর্তন সহ

using System;
using Newtonsoft.Json;

namespace JsonPrettyPrint
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Product product = new Product
                {
                    Name = "Apple",
                    Expiry = new DateTime(2008, 12, 28),
                    Price = 3.99M,
                    Sizes = new[] { "Small", "Medium", "Large" }
                };

            string json = JsonConvert.SerializeObject(product, Formatting.Indented);
            Console.WriteLine(json);

            Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
        }
    }

    internal class Product
    {
        public String[] Sizes { get; set; }
        public decimal Price { get; set; }
        public DateTime Expiry { get; set; }
        public string Name { get; set; }
    }
}

ফলাফল

{
  "Sizes": [
    "Small",
    "Medium",
    "Large"
  ],
  "Price": 3.99,
  "Expiry": "\/Date(1230447600000-0700)\/",
  "Name": "Apple"
}

ডকুমেন্টেশন: সিরিজ একটি বস্তু


তার ব্লগে জেমস
R0MANARMY

15
@ ব্র্যাড তিনি পুরোপুরি একই কোডটি দেখিয়েছিলেন, তবে একটি মডেল ব্যবহার করেছেন
মিয়া

সুতরাং ধারণাটি কেবল
বিন্যাসযোগ্য ndযুক্ত

এই পদ্ধতিটি JSON ফর্ম্যাট ত্রুটিগুলি করা থেকেও একটি সংরক্ষণ করে।
অঙ্কুশান গোয়েল

171

Json.Net লাইব্রেরির জন্য একটি সংক্ষিপ্ত নমুনা কোড

private static string FormatJson(string json)
{
    dynamic parsedJson = JsonConvert.DeserializeObject(json);
    return JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
}

আপনি আসলে এটি আরও একধাপ এগিয়ে নিয়ে যেতে পারেন এবং একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন; এটি সর্বজনীন করুন এবং স্বাক্ষরটি ফর্ম্যাটজেসনে পরিবর্তন করুন (এই স্ট্রিং
জসন

129

যদি আপনার কাছে JSON স্ট্রিং থাকে এবং এটি "প্রাকটাইফাই" করতে চান, তবে এটি কোনও পরিচিত সি # টাইপ থেকে এবং এটি সিরিয়ালিয়াস করতে চান না তবে নিম্নলিখিতটি কৌতুকটি করে (JSON.NET ব্যবহার করে):

using System;
using System.IO;
using Newtonsoft.Json;

class JsonUtil
{
    public static string JsonPrettify(string json)
    {
        using (var stringReader = new StringReader(json))
        using (var stringWriter = new StringWriter())
        {
            var jsonReader = new JsonTextReader(stringReader);
            var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented };
            jsonWriter.WriteToken(jsonReader);
            return stringWriter.ToString();
        }
    }
}

6
কেবল একটি জসন স্ট্রিংকে প্রশংসিত করার জন্য এটি অন্যদের তুলনায় এটি একটি যথাযথ সমাধান ...
জেনস মার্চেওয়কা

2
নিম্নলিখিত ব্যবহারের ক্ষেত্রে ব্যর্থ হবে: JsonPrettify("null")এবংJsonPrettify("\"string\"")
একেভু

1
ধন্যবাদ @ একভু, আমি এটিকে আমার আগের সংস্করণে ফিরিয়ে দিয়েছি!
ডানকান স্মার্ট

পছন্দ করুন এই সংস্করণটি কম অস্থায়ী বস্তু তৈরি করে। আমি মনে করি যে আমি যে সমালোচনা করেছি সেগুলির চেয়ে এটি ভাল those
ইকেভো

97

বিদ্যমান জেএসওনকে প্রশংসিত করার জন্য সবচেয়ে সংক্ষিপ্ত সংস্করণ : (সম্পাদনা করুন: JSON.net ব্যবহার করে)

JToken.Parse("mystring").ToString()

ইনপুট:

{"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }}

আউটপুট:

{
  "menu": {
    "id": "file",
    "value": "File",
    "popup": {
      "menuitem": [
        {
          "value": "New",
          "onclick": "CreateNewDoc()"
        },
        {
          "value": "Open",
          "onclick": "OpenDoc()"
        },
        {
          "value": "Close",
          "onclick": "CloseDoc()"
        }
      ]
    }
  }
}

কোনও বিষয়টিকে সুন্দরভাবে মুদ্রণ করতে :

JToken.FromObject(myObject).ToString()

4
এটি আগাম জসনের কাঠামো না জেনেও কাজ করে। এবং এটি এখানে সংক্ষিপ্ত উত্তর
পরকীয়া

1
এটি কাজ করে, তবে কেবল যদি জসন বস্তুটি অ্যারে না হয়। যদি আপনি জানেন তবে এটি একটি অ্যারে হবেন তবে আপনি আমাদের JArray করতে পারেন instead পরিবর্তে পার্স।
লুক Z

3
আহ, ভাল কথা, ধন্যবাদ। আমি JTokenপরিবর্তে আমার উত্তর আপডেট করেছি JObject। এটি বস্তু বা অ্যারে নিয়ে কাজ করে, যেহেতু JTokenউভয়ের জন্য পূর্বপুরুষ শ্রেণি JObjectএবং JArray
asherber

অনেক ধন্যবাদ, মানুষ আমি এই সমাধানটি পেতে প্রায় ২ ঘন্টা নষ্ট করেছি ... @ স্ট্যাকওভারফ্লো ছাড়া আমার জীবন কল্পনাও করা যায় না ...
রুদ্রেশ পরমেশ্প্পা

আমি অন্য উত্তরগুলির চেয়ে সত্যই এটি পছন্দ করি। সংক্ষিপ্ত কোড এবং কার্যকর। আপনাকে ধন্যবাদ
মার্ক রুসেল

47

অনেলাইনার ব্যবহার করে Newtonsoft.Json.Linq:

string prettyJson = JToken.Parse(uglyJsonString).ToString(Formatting.Indented);

আমি সম্মত হলাম নিউটনসফট ব্যবহার করে জেএসএন ফর্ম্যাট করার সহজতম এপিআই
ইথান উউ

2
নিউটোনসফট.জেসনে এটি সন্ধান করতে পেলাম না ... সম্ভবত আমার একটি পুরানো সংস্করণ রয়েছে।
cslotty

2
এটি নিউটনসফট.জসন.লিনক নেমস্পেসে। আমি কেবল এটি জানি কারণ আমি এটি অনুসন্ধান করতেও গিয়েছিলাম।
ক্যাপ্টেন কেনপাচি

12

জসন ফর্ম্যাট করার জন্য আপনি নিম্নলিখিত মানক পদ্ধতিটি ব্যবহার করতে পারেন

JsonReaderWriterFactory.CreateJsonWriter (স্ট্রিম স্ট্রিম, এনকোডিং এনকোডিং, বুলের নিজস্ব স্ট্রিম, বুল ইন্ডেন্ট, স্ট্রিং ইনডেন্টচারস)

শুধুমাত্র "ইনডেন্ট == সত্য" সেট করুন

এরকম কিছু চেষ্টা করুন

    public readonly DataContractJsonSerializerSettings Settings = 
            new DataContractJsonSerializerSettings
            { UseSimpleDictionaryFormat = true };

    public void Keep<TValue>(TValue item, string path)
    {
        try
        {
            using (var stream = File.Open(path, FileMode.Create))
            {
                //var currentCulture = Thread.CurrentThread.CurrentCulture;
                //Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

                try
                {
                    using (var writer = JsonReaderWriterFactory.CreateJsonWriter(
                        stream, Encoding.UTF8, true, true, "  "))
                    {
                        var serializer = new DataContractJsonSerializer(type, Settings);
                        serializer.WriteObject(writer, item);
                        writer.Flush();
                    }
                }
                catch (Exception exception)
                {
                    Debug.WriteLine(exception.ToString());
                }
                finally
                {
                    //Thread.CurrentThread.CurrentCulture = currentCulture;
                }
            }
        }
        catch (Exception exception)
        {
            Debug.WriteLine(exception.ToString());
        }
    }

লাইনগুলিতে আপনার মনোযোগ দিন

    var currentCulture = Thread.CurrentThread.CurrentCulture;
    Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
    ....
    Thread.CurrentThread.CurrentCulture = currentCulture;

কিছু প্রকারের এক্সএমএল-সিরিয়ালাইজের জন্য আপনার কম্পিউটারে বিভিন্ন আঞ্চলিক সেটিংস সহ ডিসিরিয়ালাইজেশন চলাকালীন ব্যতিক্রম এড়ানোর জন্য আপনার ইনভেরেন্ট কালচার ব্যবহার করা উচিত । উদাহরণস্বরূপ, ডাবল বা ডেটটাইমের অবৈধ বিন্যাস কখনও কখনও তাদের কারণ ঘটায়।

Deserialization জন্য

    public TValue Revive<TValue>(string path, params object[] constructorArgs)
    {
        try
        {
            using (var stream = File.OpenRead(path))
            {
                //var currentCulture = Thread.CurrentThread.CurrentCulture;
                //Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

                try
                {
                    var serializer = new DataContractJsonSerializer(type, Settings);
                    var item = (TValue) serializer.ReadObject(stream);
                    if (Equals(item, null)) throw new Exception();
                    return item;
                }
                catch (Exception exception)
                {
                    Debug.WriteLine(exception.ToString());
                    return (TValue) Activator.CreateInstance(type, constructorArgs);
                }
                finally
                {
                    //Thread.CurrentThread.CurrentCulture = currentCulture;
                }
            }
        }
        catch
        {
            return (TValue) Activator.CreateInstance(typeof (TValue), constructorArgs);
        }
    }

ধন্যবাদ!


হাই, @ মেকম্যান, আপনি কি বিভিন্ন সংস্কৃতি দ্বারা সৃষ্ট সিরিয়ালের ত্রুটিগুলি পুনরুত্পাদন করেছেন? এক্সএমএলজেসন রাইটার / রিডার রূপান্তরগুলির মতো মনে হচ্ছে সমস্ত সংস্কৃতি আগমনকারী।
অলেক্সান্দার ইভানিতস্কি

হ্যালো, আমি এক্সএমএলজসন রাইটার / রিডার সম্পর্কে নিশ্চিত নই, তবে ডেটা কন্ট্রাক্ট জসনসিরাইজার থ্রেড.কন্ট্রেন্টথ্রেড.কেন্দ্রিক কালচার ব্যবহার করেন। ত্রুটিগুলি ঘটতে পারে যখন মেশিন এ তে সিরিয়ালাইজ করা হয়েছে তবে অন্য আঞ্চলিক সেটিংসের সাহায্যে বিতে ডিসরিয়ালাইজ করা হয়েছে।
মেকম্যান

আমি DataContractJsonSerializerসমাবেশে পচিয়েছি System.Runtime.Serialization v.4.0.0.0, এর স্পষ্ট কোন ব্যবহার নেই CurrentCulture। একটি সংস্কৃতির একমাত্র ব্যবহার CultureInfo.InvariantCultureবেস ক্লাসে XmlObjectSerializer, অভ্যন্তরীণ পদ্ধতিতে TryAddLineInfo
অলেক্সান্দার ইভানিতস্কি

সুতরাং, এটি আমার ভুল হতে পারে। আমি পরে এটি পরীক্ষা করব। সম্ভব, আমি অন্য সংস্করণীকরণ বাস্তবায়ন থেকে এই সংস্কৃতি ইস্যুটি এক্সট্রপোলেট করছি।
মেকম্যান 10

1
আমি মূল উত্তরটি সম্পাদনা করেছি। দেখে মনে হয় যে ডেটা কনট্রাক্ট সিরিয়ালাইজারগুলি সংস্কৃতি স্বাধীন, তবে অন্য ধরণের সিরিয়ালাইজরের মাধ্যমে সিরিয়ালকরণের সময় সংস্কৃতি নির্দিষ্ট ত্রুটিগুলি এড়াতে আপনার মনোযোগ সংরক্ষণ করা উচিত। :)
মেকম্যান

6

এগুলি একটি সাধারণ লাইনে করা যেতে পারে:

string jsonString = JsonConvert.SerializeObject(yourObject, Formatting.Indented);

1
'নিউটনসফট.জসন ব্যবহার করে' যুক্ত করতে মনে রাখবেন
এবুউব

ভাল উত্তর আমার বন্ধু।
রজারএডওয়ার্ড

4

মাইক্রোসফ্টের সিস্টেম.টেক্সট.জসন লাইব্রেরি ব্যবহার করে এখানে একটি সমাধান দেওয়া হয়েছে :

static string FormatJsonText(string jsonString)
{
    using var doc = JsonDocument.Parse(
        jsonString,
        new JsonDocumentOptions
        {
            AllowTrailingCommas = true
        }
    );
    MemoryStream memoryStream = new MemoryStream();
    using (
        var utf8JsonWriter = new Utf8JsonWriter(
            memoryStream,
            new JsonWriterOptions
            {
                Indented = true
            }
        )
    )
    {
        doc.WriteTo(utf8JsonWriter);
    }
    return new System.Text.UTF8Encoding()
        .GetString(memoryStream.ToArray());
}

যারা অতিরিক্ত প্যাকেজ কিনতে পারবেন না তাদের জন্য এটি একটি ভাল সমাধান। ভাল কাজ করে.
টি

2

প্রথমে আমি ডানকান স্মার্ট পোস্টের অধীনে মন্তব্য যুক্ত করতে চেয়েছিলাম, তবে দুর্ভাগ্যক্রমে আমি এখনও মন্তব্য করার মতো যথেষ্ট খ্যাতি পাইনি। সুতরাং আমি এখানে এটি চেষ্টা করব।

আমি শুধু পার্শ্ব প্রতিক্রিয়া সম্পর্কে সতর্ক করতে চাই।

JsonTextReader অভ্যন্তরীণভাবে json কে টাইপ করা JTokens- এ পার্স করে এবং সেগুলি আবার সিরিয়ালাইজ করে।

উদাহরণস্বরূপ যদি আপনার আসল JSON ছিল

 { "double":0.00002, "date":"\/Date(1198908717056)\/"}

প্রশংসার পরে আপনি পেতে

{ 
    "double":2E-05,
    "date": "2007-12-29T06:11:57.056Z"
}

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


এই বিশদটি সম্পর্কে এখানে একটি দুর্দান্ত আলোচনা রয়েছে ... github.com/JamesNK/Newtonsoft.Json/issues/862 এই বিবরণটি কীভাবে বিকশিত হয়েছে তা আকর্ষণীয়। আমি আমার প্রাথমিক জসন পার্সার সম্পর্কে নতুন কিছু শিখেছি - আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ।
এসকিএল সার্ফার

2

System.Text.Jsonসেট ব্যবহার JsonSerializerOptions.WriteIndented = true:

JsonSerializerOptions options = new JsonSerializerOptions { WriteIndented = true };
string json = JsonSerializer.Serialize<Type>(object, options);

1

netcoreapp3.1

var js = JsonSerializer.Serialize(obj, new JsonSerializerOptions {
             WriteIndented = true
         });

0

এটি আমার পক্ষে কাজ করেছে। যদি কেউ VB.NET সংস্করণ খুঁজছেন।

@imports System
@imports System.IO
@imports Newtonsoft.Json

Public Shared Function JsonPrettify(ByVal json As String) As String
  Using stringReader = New StringReader(json)

    Using stringWriter = New StringWriter()
      Dim jsonReader = New JsonTextReader(stringReader)
      Dim jsonWriter = New JsonTextWriter(stringWriter) With {
          .Formatting = Formatting.Indented
      }
      jsonWriter.WriteToken(jsonReader)
      Return stringWriter.ToString()
    End Using
  End Using
End Function

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