2011-01-28 15 views
6

पर सामान जोड़ने डेल्फी डेटा स्नैप फ्रेमवर्क मैं डेल्फी एक्सई डेटा स्नैप आरईएसटी सर्वर के साथ काम कर रहा हूं और एक JSON क्रमबद्ध ऑब्जेक्ट को वापस करने का प्रयास कर रहा हूं। नतीजा यह है कि मेरी विधि क्लाइंट पर लौट रही है इस तरह दिखती है:जेएसओएन संदेश

{"type":"ServerMethodsUnit1.TJSONIssue", 
"id":1, 
"fields":{ 
      "FIssueNo":90210, 
      "FTitle":"Beverly Hills...that''s where I want to be", 
      "FKind":"Wishlist" 
      } 
} 

अच्छी तरह से जेएसओएन बनाया गया।

समस्या है जब संदेश ग्राहक द्वारा प्राप्त होता है, यह है कि सामान का एक समूह से जोड़ रहे है और यह इस तरह दिखता है:

{"result": ["{\"type\":\"ServerMethodsUnit1.TJSONIssue\", 
       \"id\":1, 
       \"fields\":{ 
          \"FIssueNo\":90210, 
          \"FTitle\":\"Beverly Hills...that's where I want to be\", 
          \"FKind\":\"Wishlist\"} 
      } 
      " 
      ] 
} 

मैं बैकस्लैश पात्रों में से एक गुच्छा और उस "result" हो रही है सामने टैग करें।

मैं सोच रहा था कि क्या कोई जानता है कि मुझे यह अतिरिक्त सामान क्यों मिल रहा है और इससे कैसे छुटकारा पाना है।

+0

ऐसा लगता है कि आप एक डबल JSON कर रहे हैं? एस्केप कैरेक्टर (बैकस्लैश) JSON तारों के लिए मानक है। –

उत्तर

2

क्या आप क्लाइंट के रूप में डेल्फी डेस्कटॉप का उपयोग कर रहे हैं? यदि हाँ हो सकता है आप अपने विधि से अन्य वापसी की कोशिश कर सकते उदाहरण के लिए, क्योंकि डेल्फी JSON

के लिए किसी भी वापसी प्रकार की स्वचालित रूप से रूपांतरण बनाने: एक DBXReader वापसी एक JSON प्रकार

में परिवर्तित हो जाएगा मामले में आप अन्य ग्राहक (PHP, जावा, फ्लेक्स) मैं आपकी मदद करने के लिए नहीं कर सकता। मुझे एक ही समस्या है .. मैंने JSONObject को पैरामीटर के रूप में प्राप्त करने के लिए एक विधि बनाई है और मैंने इस विधि को आमंत्रित करने के लिए एक समान PHP कोड किया है ... मैंने ऑब्जेक्ट क्लास बनाया है और इसे पास कर दिया है .. सर्वर में यह JSONObject को परिवर्तित नहीं कर सकता ऑब्जेक्ट ... त्रुटि तब होती है जब UnMarshall निष्पादित होता है ..

मेरे परीक्षण केवल प्राचीन प्रकार के साथ काम करते हैं!

4

आपके द्वारा पोस्ट किया गया JSON एक दूरस्थ विधि के परिणाम का प्रतिनिधित्व करता है जो एक स्ट्रिंग देता है, JSONObject नहीं। वापस जाने के लिए एक JSONObject निम्नलिखित होना चाहिए सही तरीका (संकलित नहीं/परीक्षण किया):

function TMyRemote.GetSomething: TJSONValue; 
begin 
    Result := TJSONObject.Create; 
    Result.Add("Name","Daniele Teti"); //used the overloaded version of add (string, string) 
end; 

अब json सही होना चाहिए। परिणाम स्ट्रिंग में परिणाम तत्व डिज़ाइन किया गया है। आप परिणाम सरणी के पहले तत्व को पढ़ सकते हैं और अपना मूल JSONObject प्राप्त कर सकते हैं।

4

"result" टैग से छुटकारा पाने के लिए आपको OnFormatResultTDSHTTPWebDispatcher का उपयोग करना चाहिए। Especialy मूल्य HandledHandled का मान डिफ़ॉल्ट रूप से false है। यदि true पर सेट किया गया है, तो उपयोगकर्ता को पास किया गया परिणाम "result" JSON ऑब्जेक्ट में लपेटा नहीं जाएगा। यदि यह गलत है, तो यह इस वस्तु में लपेटा जाएगा।

उदाहरण। मैं इस तरह कोड है:

function TServerMethods1.EchoStringJSON(Value: string): TJSONObject; 
var 
    JSONObj : TJSONObject; 
begin 
    JSONObj := TJSONObject.Create; 
    JSONObj.AddPair(TJSONPair.Create('name',Value)); 
    result := JSONObj; 
end; 

बाकी सेवा प्रतिक्रिया इस प्रकार है: {"result":[{"name":"asdfasdf"}]}

मैं Handled := true; जोड़ें:

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject; 
    var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean); 
begin 
    Handled := true; 
end; 

बाकी सेवा प्रतिक्रिया इस प्रकार है: [{"name":"asdfasdf"}]

अभी भी "[]" है।{"name":"asdfasdf"}

पुनश्च:

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject; 
    var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean); 
var 
    Aux: TJSONValue; 
begin 
    //remove [] element 
    Aux := ResultVal; 
    ResultVal := TJSONArray(Aux).Items[0]; 
    TJSONArray(Aux).Remove(0); 
    Aux.Free; 
    //we do not need "result" tag 
    Handled := true; 
end; 

अब की तरह दिखता परिणाम: तो मैं कुछ अतिरिक्त कोड जोड़ सकते हैं। उत्तर यहां मिला: section FormatResult Event for REST Responses

संबंधित मुद्दे