मैं सी # में एक कक्षा से एक जेसन बना रहा हूं और जेसन को छोटा बनाने के लिए मैं स्ट्रिंग कुंजियों को संख्याओं के साथ प्रतिस्थापित करना चाहता हूं जो कई enums से मेल खाते हैं। एक उदाहरण एक जेसन होगा जो इस तरह दिखता है:

{
"initdata": 
{
"cell": {
  "apn": "n",
  "userName": "n",
  "password": "n",
  "number": "n"
},
"wifi": {
  "mode": "AP",
  "ssid": "m",
  "password": ","
},
"ports": {
  "p1": "k",
  "p2": "y",
  "p3": "5"
}
}

और एनम जो इस तरह दिखता है:

public enum celle { apn, userName, password, number };
public enum wifie { mode, ssid, password };
public enum portse { p1, p2, p3 };
public enum initdatae { cell , wifi , ports};
public enum settingse { initdata, timers }

और फिर मैं चाहता हूं कि जेसन इस तरह दिखे:

{
"0": 
{
"0": {
  "0": "n",
  "1": "n",
  "2": "n",
  "3": "n"
},
"1": {
  "0": "AP",
  "1": "m",
  "2": ","
},
"2": {
  "0": "k",
  "1": "y",
  "2": "5"
}
}

धन्यवाद

0
Yuval Toren 27 अप्रैल 2017, 15:55
आप किस जेसन सीरिएलाइज़र का उपयोग करते हैं?
 – 
Ruben Vardanyan
27 अप्रैल 2017, 16:19
1
यदि आपको वास्तव में इस प्रकार की बाइट बचत की आवश्यकता है, तो आप जेसन का उपयोग क्यों कर रहे हैं? कुछ कस्टम csv डेटा का उपयोग क्यों न करें जैसे 0:n,n,n,n|1:AP,m,m|2:k,y,5 (आप 161-26=135 बाइट्स बचाएंगे)
 – 
Matthieu Charbonnier
27 अप्रैल 2017, 16:20

2 जवाब

यदि आप गुणों के नामों का नाम बदलने के लिए Json.Net का उपयोग कर रहे हैं, तो उदाहरण के लिए यहां देखें (स्टैक ओवरफ्लो पर बहुत कुछ है): सी # में जेसन संपत्ति का नाम अधिलेखित करें

और मूल्यों के लिए, मेरा सुझाव है कि आप प्रत्येक एनम को एक इंट असाइन करें:

public enum celle 
{
     apn = 0, 
     userName = 1, 
     password = 2, 
     number = 3 
};

और फिर आपने एनम को एक इंट में डाल दिया ताकि इसे जोंस में बदलने से पहले मूल्य प्राप्त किया जा सके:

int celleValue = (int)celle.userName;

तो, अंत में आपकी कक्षा कुछ इस तरह दिखेगी:

public class ClassToConvert()
{
    [JsonIgnore] // this property will not be on the json
    public celle celleValue {get;set;}
    [JsonProperty(PropertyName = "c1")]
    public int celleShort
    {
        get
        {
            return (int)this.celleValue;
        }
    }
}

public enum celle 
{
     apn = 0, 
     userName = 1, 
     password = 2, 
     number = 3 
};
1
Community 23 मई 2017, 15:25

यदि आपके पास अपने इनपुट JSON के लिए POCO परिभाषित नहीं है, तो आप अपनी संपत्तियों का नाम इस प्रकार बदल सकते हैं:

  • इनपुट JSON को ExpandoObject में डिसेरिएलाइज़ करें
  • वांछित के रूप में ExpandoObject के गुणों का नाम बदलें
  • ExpandoObject को वापस JSON पर क्रमबद्ध करें:
public static void Main(string[] args)
{
    var json = @"{
        ""initdata"":  {
            ""cell"": {
                ""apn"": ""n"",
                ""userName"": ""n"",
                ""password"": ""n"",
                ""number"": ""n""
            },
            ""wifi"": {
                ""mode"": ""AP"",
                ""ssid"": ""m"",
                ""password1"": "",""
            },
            ""ports"": {
                ""p1"": ""k"",
                ""p2"": ""y"",
                ""p3"": ""5""
            }
        }
    }";
    dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json, new ExpandoObjectConverter());
    PrepareEnumIds();
    RenameEnumProps(obj as ExpandoObject);
    var shortJson = JsonConvert.SerializeObject(obj, Formatting.Indented);
    Console.WriteLine(shortJson);
}

public static void RenameEnumProps(ExpandoObject expando)
{
    var expandoDict = expando as IDictionary<string, object>;
    var props = new List<string>(expandoDict.Keys);
    for (var i = props.Count - 1; i >= 0; i--)
    {
        var child = expandoDict[props[i]];
        if (child is ExpandoObject)
            RenameEnumProps(child as ExpandoObject);
        if (enumIds.ContainsKey(props[i]))
        {
            expandoDict.Add(enumIds[props[i]], child);
            expandoDict.Remove(props[i]);
        }
    }
}

static Dictionary<string, string> enumIds = new Dictionary<string, string>();

static void PrepareEnumIds()
{
    foreach (var enumType in new[] { typeof(celle), typeof(wifie), typeof(portse), typeof(initdatae), typeof(settingse) })
        foreach (var enumValue in Enum.GetValues(enumType))
            enumIds.Add(enumValue.ToString(), ((int)enumValue).ToString());
}

public enum celle { apn, userName, password, number };
public enum wifie { mode, ssid, password1 };
public enum portse { p1, p2, p3 };
public enum initdatae { cell, wifi, ports };
public enum settingse { initdata, timers }

डेमो: https://dotnetfiddle.net/IPqxEQ

नोट: मैंने सभी एनम मानों को अद्वितीय बनाने के लिए password के मानों में से एक को बदलकर थोड़ा धोखा दिया है, क्षमा करें। इसने नाम बदलने के कार्यान्वयन को काफी आसान बना दिया। लेकिन यह कार्यान्वयन के मुख्य बिंदु को प्रभावित नहीं करता है। जब मेरे पास कुछ और खाली समय होगा, तो मैं एक पूर्ण कार्यान्वयन प्रदान करूंगा।

0
Dmitry Egorov 27 अप्रैल 2017, 17:35