नवीनतम अपडेट w / उत्तर

(१०/२६/२०२०) - @N.Dogac के समाधान को देखते हुए मुझे इस दस्तावेज़ को पढ़कर एक कार्यशील समाधान मिला https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to

उत्तर यहां देखा जा सकता है: https:// github.com/RyanHarlich/My-Stackoverflow-Dotnet-Core-REST-API-Question/commit/0db8fa860eda7e9d201874f8f1abc38d168e0eaf

अद्यतन

(१०/२/२०२०) - मुझे एहसास हुआ कि इसे पुन: प्रस्तुत करना मुश्किल और/या समय लेने वाला हो सकता है इसलिए मैंने वास्तविक समस्या पर ध्यान केंद्रित करने के लिए एक गिटहब रेपो जोड़ा; बेशक, यह केवल एक नमूना है और मेरा वास्तविक काम नहीं है इसलिए विवरण छोड़ दिया गया था। मैंने अपने प्रश्न को हल करने के लिए केवल पर्याप्त जानकारी प्रदान की है। यहाँ क्लिक करें My GitHub रेपो या वास्तविक लिंक पर क्लिक करें (< a href="https://github.com/RyanHarlich/My-Stackoverflow-Dotnet-Core-REST-API-Question" rel="nofollow noreferrer">https://github.com/RyanHarlich/My-Stackoverflow-Dotnet -कोर-रेस्ट-एपीआई-प्रश्न)

अगर किसी के पास बेहतर समाधान नहीं है तो मैं थोड़ी देर बाद @ N.Dogac के समाधान का प्रयास करने जा रहा हूं।

प्रश्न

प्रश्न: मैं सोच रहा था कि C# .NET Core REST API में लाइब्रेरी का उपयोग करने वाले क्लाइंट के साथ मैं JSONPropertyName का नाम कैसे बदलूं।

उदाहरण के लिए:

पुस्तकालय

लाइब्रेरी डीएलएल डब्ल्यू/मास्टरनोड जो मॉडल विवरण को बढ़ाता है

public abstract class APIModel {
public MasterNode Links { get; set; }

public void AddInfo(IUnitOfWork context) {
    Links = context.InheritedMasterNode;
    Links.Add();
}

public abstract class MasterNode {
    public abstract List<float> Info { get; set; }
    public void Add() {
        Info = new List<float>() { 100.0f };
    }
}
}

लाइब्रेरी डीएलएल में मॉडल

public class Info : APIModel {
    public int id;
    public String title;
}

लाइब्रेरी में DLL में InfoController होता है

[Route("api/[controller]")]
    [ApiController]
    public class InfosController : ControllerBase {
        private readonly IUnitOfWork _unitOfWork;

        public InfosController(IUnitOfWork context) {
            _unitOfWork = context;
        }

        // GET: api/Infos
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Models.HyperMediaControls.APIBase>>> GetAPIs() {
            ResetInfo().Wait();
            var conn = _unitOfWork.DBContext.Database.GetDbConnection();
            if (conn.State != ConnectionState.Open)
                conn.Open();

            _unitOfWork.DBContext.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Info ON");
            Info info = new Library.Models.Info() { Id = 1 };
            info.Title = "Info";
            await _unitOfWork.Repository<Info>().InsertEntityAsync(info);

            await _unitOfWork.SaveChangesAsync();
            conn.Close();

            Add(info);

            return await _unitOfWork.Repository<Info>().ToListAsync();
        }

        private async Task ResetInfo() {
            Info info = await _unitOfWork.Repository<Info>().FirstOrDefault();
            if (info != null) {
                _unitOfWork.Repository<Info>().Empty(info);
                await _unitOfWork.SaveChangesAsync();
            }
        }

        public void Add(Models.HyperMediaControls.APIBase info) {
            info.AddInfo(, _unitOfWork);
        }
    }

ग्राहक

क्लाइंट: [JsonPropertyName("InfoInherited")] वह है जिसे मैं हासिल करने की कोशिश कर रहा हूं

public abstract class InheritedMasterNode : MasterNode {
    [JsonPropertyName(“InfoInherited”)]
    public override List<float> Info { get; set; } = null;
}

विवरण

क्लाइंट से लाइब्रेरी में बच्चे को इनहेरिटेडमास्टरनोड प्राप्त करने के लिए मैंने इस विधि का उपयोग किया, जिसे मैंने नहीं जोड़ा क्योंकि यह स्टैक ओवरफ्लो पोस्ट के लिए बहुत अधिक कोड है: https://stackoverflow.com/a/59753787/8360201

  • नोट: आप InheritedMasterNode को MasterNode हैंडलर में इंजेक्ट करने के लिए IUnitOfWork का उपयोग करते हैं और इसे APIModel क्लास में UnitOfWork की संपत्ति InheritedMasterNode के साथ उपयोग करते हैं।

मुझे जिस समस्या का सामना करना पड़ रहा है वह मेरी टिप्पणियों में वर्णित है: https://stackoverflow.com/a/37927869/8360201

  • नोट: इस स्टैक ओवरफ़्लो पोस्ट का उत्तर काम नहीं करता क्योंकि यह एक स्ट्रिंग को क्रमबद्ध करता है; जहाँ के रूप में, मैं C# .NET Core REST API नियंत्रकों का उपयोग करता हूँ।

कृपया मुझे बताएं कि आपको इसे पुन: पेश करने में मदद करने के लिए आपको क्या चाहिए। मैंने बहुत सारे कोड छोड़े हैं क्योंकि यह मेरा निजी रेपो है और छोटी समस्या को समझने के लिए इसे पढ़ना बहुत अधिक होगा।

अवलोकन:

  • लाइब्रेरी डीएलएल से संबंधित है: जानकारी, इन्फोकंट्रोलर, एपीआईमॉडल, मास्टरनोड, यूनिटऑफवर्क, सर्विसकोलेक्शन एक्सटेंशन
  • क्लाइंट के अंतर्गत आता है: इनहेरिटेडमास्टरनोड, स्टार्टअप.कॉन्फ़िगरसर्विस

मैं इस निष्कर्ष पर पहुंचा हूं कि यह संभव नहीं है और इन डीएलएल में अपग्रेड करने के लिए .NET कोर टीम की आवश्यकता होगी, लेकिन मैं स्टैक ओवरफ्लो समुदाय से पूछकर इसे अंतिम प्रयास दे रहा हूं:

  • Microsoft.AspNetCore.Mvc का उपयोग करना;
  • Microsoft.EntityFrameworkCore का उपयोग करना;

यहाँ वास्तविक आउटपुट बनाम वांछित है: जानकारी -> infoInherited

वास्तविक आउटपुट:

[
  {
    "id": 1,
    "title": "Info",
    "links": {
      "info": [
        ]
     }
  }
]

वांछित आउटपुट:

[
  {
    "id": 1,
    "title": " Info ",
    "links": {
      "infoInherited": [
        ]
     }
  }
]
0
Ryan Harlich 30 सितंबर 2020, 00:08

1 उत्तर

सबसे बढ़िया उत्तर

आप प्रश्न के प्रकार के लिए एक Json कनवर्टर पंजीकृत करके इसे प्राप्त करने में सक्षम होना चाहिए

services.AddMvc()
    .AddJsonOptions(options =>
    {
         options.SerializerSettings.Converters.Add(new  APIModelJsonConverter());
     });

class APIModelJsonConverter: JsonConverter<APIModel> {
    public override void Write(Utf8JsonWriter writer, APIModel m, JsonSerializerOptions options) {
        var intermediateJson = JsonSerializer.Serialize(m, options);
        var intermediateObject = JsonSerializer.Deserialize<Dictionary<string, object>>(intermediateJson, options);
         intermediateObject["infoInherited"] = intermediateObject["info"];
         intermediate.Remove("info");

         writer.Write(intermediate, options);
    }
} 
1
Aluan Haddad 3 अक्टूबर 2020, 23:50