मैंने इसे एक एपीआई के लिए कार्यान्वित किया जो केवल JSON लौटाता है।
सबसे पहले मैं करने के लिए दो structs बनाया (डी) को क्रमानुसार और "फील्ड" क्वेरी तर्क पुनरावर्ती वाक्य रचना की व्याख्या:
FieldSelector
है, जो एक क्षेत्र निर्दिष्ट करता है और संभवतः अपने बच्चों FieldSelection
कोष्ठक के बीच संलग्न;
FieldsSelection
, जो FieldSelector
की अल्पविराम से अलग सूची है।
मैं वर्गों के बजाय structs का उपयोग किया है, क्योंकि AFAIK, आप वर्ग (डी) क्रमबद्धता/से ServiceStack के URL में करती है। Structs के साथ आप इसे ToString
(सीरिएलाइज़र) ओवरराइड करके और पैरामीटर (deserializer) के रूप में एक स्ट्रिंग को स्वीकार करने वाला एक कन्स्ट्रक्टर प्रदान कर सकते हैं।
तो फिर तुम हर अनुरोध डीटीओ कि JSON देता है पर इस में शामिल हैं:
FieldsSelection Fields { get; set; }
एक कस्टम पर ServiceRunner<T>.OnAfterExecute
आप JSON के जवाब डीटीओ को क्रमानुसार, ServiceStack.Text के JsonObject
साथ उसे पार्स और एक साथ रिकर्सिवली क्षेत्रों चयन लागू इस तरह विधि:
private static JsonObject Apply(this JsonObject json, FieldsSelection fieldMask)
{
IEnumerable<string> keysToRemove = json.Keys.ToList().Except(fieldMask.Keys);
foreach (var key in keysToRemove)
json.Remove(key);
foreach (var selector in fieldMask.Selectors.Values.Where(s => s.HasSubFieldsSelection))
{
var field = json[selector.Field];
if (field == null)
continue;
switch (field[0])
{
case '{':
json[selector.Field] = Apply(json.Object(selector.Field), selector.SubFieldsSelection).ToJson();
break;
case '[':
var itensArray = json.ArrayObjects(selector.Field);
for (int i = 0; i < itensArray.Count; i++)
itensArray[i] = Apply(itensArray[i], selector.SubFieldsSelection);
json[selector.Field] = itensArray.ToJson();
break;
default:
throw new ArgumentException("Selection incompatible with object structure");
}
}
return json;
}
तो आप अपनी प्रतिक्रिया डीटीओ के रूप में परिणाम लौटने। मैंने नकारात्मक फ़ील्ड चयनकर्ताओं को भी लागू किया है (fields=-foo
foo को छोड़कर सभी डीटीओ फ़ील्ड का चयन करता है), लेकिन आपको विचार मिलता है।
मैंने इस विधि पर विचार किया था, और यह करने का एकमात्र संभव तरीका हो सकता है।यह प्रॉपर्टी ट्री को उन क्षेत्रों को स्थापित करने के लिए डबल हैंडलिंग जैसा लगता है, जिन्हें आप शून्य पर वापस नहीं करना चाहते हैं, क्योंकि सीरियलज़र जेसन प्रतिक्रिया को आउटपुट करने के लिए फिर से संपत्ति के पेड़ पर जा रहा है। – jmc
अगर नल लौटाया जाता है या नहीं तो नियंत्रण करने के लिए एक कॉन्फ़िगरेशन प्रॉपर्टी होती है। 'JsConfig.IncludeNullValues' – jmc
दुर्भाग्य से यह मूल्य-टाइप किए गए डीटीओ सदस्यों के लिए काम नहीं करेगा। – starteleport