2011-09-04 16 views
7

मैं निम्नलिखित JSON एक जावा सेवाJSON.NET रूट टैग और Deserialization

{"Test":{ 
    "value": 1, 
    "message": "This is a test" 
    }} 

मैं है निम्नलिखित सी # वर्ग

class Test { 
    public int value { get; set; } 
    public String message { get; set; } 
} 

हालांकि, रूट टैग "टेस्ट" है, क्योंकि से लौट रहे है लौटाया गया मैं

Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString); 

मुझे लगता है कि मुझे टेस्ट क्लास को दूसरे के अंदर लपेटना है काम करने के लिए कक्षा।

JToken root = JObject.Parse(jsonString); 
JToken testToken = root["Test"]; 
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString()); 

अंत में मेरे पास दूसरा प्रश्न है, इससे बचने का कोई आसान तरीका है। मैं जिन सेवाओं को कॉल कर रहा हूं उनमें से अधिकांश एक्सेप्शन ऑब्जेक्ट भी लौटा सकते हैं। मैंने सोचा कि मैं जेएसओएन के "रूट" टैग को ऑब्जेक्ट को deserialize कैसे निर्धारित करने के लिए पढ़ा होगा। मैं पहली रूट टैग कैसे प्राप्त करूं और/या सेवा से अपवादों को संभालने के लिए एक बेहतर, अधिक सुरुचिपूर्ण विधि है?

धन्यवाद

उत्तर

1

आप नहीं चाहते हैं एक आवरण प्रकार आप एक गुमनाम प्रकार का उपयोग कर सकते हैं बनाने के लिए:

var test = 
    JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test; 

आप अधिक गुण है, तो एक अपवाद की तरह है, यह शायद एक आवरण प्रकार बनाने के लिए बेहतर है।

1

बस एक आवरण लिखना:

public class Wrapper 
{ 
    public Test Test { get; set; } 
} 

और फिर इस आवरण को deserialize और Test संपत्ति के माध्यम से Test उदाहरण लाने:

Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test; 
2

प्रतिक्रिया वास्तव में एक वस्तु है जिसमें Test ऑब्जेक्ट शामिल है। तो आपका ऑब्जेक्ट मॉडल वही दिखना चाहिए। और चूंकि प्रतिक्रिया एक अपवाद हो सकते हैं, तो आप वह भी प्रदर्शित करना चाहिए:

class Response 
{ 
    public Test Test { get; set; } 
    public JObject Exception { get; set; } 
} 

इसमें यह माना जाता है आप कैसे दिखाई देंगे Exception देखो पता नहीं है। यदि आप करते हैं, तो JObject के बजाय एक ठोस प्रकार का उपयोग करें। इसके बाद आप Response ऑब्जेक्ट को Exceptionnull पर आधारित कर सकते हैं।

+0

मुझे लगता है कि यह वास्तव में अच्छी तरह से काम कर सकता है अगर मैं इसे सामान्य वस्तु (टेस्ट ऑब्जेक्ट के लिए) बना देता हूं। यह एक या अन्य वस्तुओं को पार्स करने का एक बहुत ही आसान तरीका है। धन्यवाद – Shaun

2

एक ही समस्या थी और वास्तव में, इस 'कंटेनर' से छुटकारा पाने के लिए चाहते थे इस समाधान पाया हालांकि आप एक अतिरिक्त स्ट्रिंग का उपयोग करना जड़ वस्तु खोजने की जरूरत है:

// Container I wanted to discard 
public class TrackProfileResponse 
{ 
    [JsonProperty("response")] 
    public Response Response { get; set; } 
} 

// Code for discarding it 
var jObject = JObject.Parse(s); 
var jToken = jObject["response"]; 
var response = jToken.ToObject<Response>();