2013-11-23 46 views
1

我正在使用Asp.Net Web API處理項目。這個API將使用另一個API,讓它稱爲B點。Json.Net中的重複值

來自B點的響應如下,並反序列化到Web API中,因爲我需要更改其中的一些信息,然後在Web API中再次序列化它。

{ 
"Row": [ 
    { 
     "key": "MjAxMy0xMQ==", 
     "Cell": [ 
      { 
       "column": "Y291bnQ6ZGFlbW9u", 
       "timestamp": 1385195582067, 
       "$": "MTE1" 
      }, 
      { 
       "column": "Y291bnQ6a2Vybg==", 
       "timestamp": 1385195582067, 
       "$": "MQ==" 
      }, 
      { 
       "column": "Y291bnQ6dXNlcg==", 
       "timestamp": 1385195582067, 
       "$": "MA==" 
      } 
     ] 
    } 
    ] 
} 

這是我的映射。

public class RowEntry 
{ 
    [JsonProperty("Row")] 
    public List<Row> Rows { get; set; } 
} 

public class Row 
{ 
    [JsonProperty("key")] 
    private string _key; 
    public string Key 
    { 
     get { return Base64Converter.ToUTF8(_key); } 
     set 
     { 
      _key = value; 
     } 
    } 

    [JsonProperty(PropertyName = "Cell")] 
    public List<Cell> Cells { get; set; } 
} 

public class Cell 
{ 
    [JsonProperty(PropertyName = "column")] 
    private string _column; 
    public string Column 
    { 
     get 
     { 
      return Base64Converter.ToUTF8(_column); 
     } 

     set 
     { 
      _column = value; 
     } 
    } 

    [JsonProperty(PropertyName = "timestamp")] 
    public string Timestamp { get; set; } 

    [JsonProperty(PropertyName = "$")] 
    private string _value; 
    public string Value 
    { 
     get 
     { 
      return Base64Converter.ToUTF8(_value); 
     } 
     set 
     { 
      _value = value; 
     } 
    } 
} 

在我的控制器我有

// Get JSON from point-B 
var response = await _client.GetStringAsync(BuildUri(table, startDate, endDate)); 
// Parse the result into RowEntry object 
var results = JsonConvert.DeserializeObject<RowEntry>(response); 
// This should return the RowEntry object as JSON as I'm using Web API here 
return results; 

這將返回一個新的JSON其中只有要素按我上面的類。但是,它似乎還包含來自B點的第一個請求的JSON。

{ 
"Row": [ 
    { 
     "Key": "decoded value here", 
     "key": "MjAxMy0xMQ==", 
     "Cell": [ 
      { 
       "Column": "decoded value here", 
       "column": "Y291bnQ6ZGFlbW9u", 
       "timestamp": 1385195582067, 
       "Value": "decoded value here", 
       "$": "MTE1" 
      }, 
      // abbreviated 
     ] 
    } 
    ] 
} 

我很困惑怎麼可能是這樣,因爲我是序列化RowEntry,我怎麼能解決這個問題?

+1

這是因爲在私人領域的'JsonProperty'屬性的發生。你需要將$的名稱切換爲值嗎?如果你確定$,這可以很容易地處理。 – Alden

+0

我不能使用$,因爲當它傳遞給視圖時,它與jQuery $發生衝突。但是你是對的,這是因爲私人領域,我需要添加'JsonIgnore'屬性。謝謝。 –

回答

2

您可以通過將[JsonIgnore]添加到已爲其裝飾相應私有成員變量的公共屬性中修復此問題。[JsonProperty]。 Json.Net不會隱式知道一個特定的私有成員變量對應於一個特定的公共屬性,所以在序列化中它將包括兩個,除非你不告訴它。

修類:

public class Row 
{ 
    [JsonProperty("key")] 
    private string _key; 
    [JsonIgnore] 
    public string Key 
    { 
     get { return Base64Converter.ToUTF8(_key); } 
     set { _key = value; } 
    } 

    [JsonProperty(PropertyName = "Cell")] 
    public List<Cell> Cells { get; set; } 
} 

public class Cell 
{ 
    [JsonProperty(PropertyName = "column")] 
    private string _column; 
    [JsonIgnore] 
    public string Column 
    { 
     get { return Base64Converter.ToUTF8(_column); } 
     set { _column = value; } 
    } 

    [JsonProperty(PropertyName = "timestamp")] 
    public string Timestamp { get; set; } 

    [JsonProperty(PropertyName = "$")] 
    private string _value; 
    [JsonIgnore] 
    public string Value 
    { 
     get { return Base64Converter.ToUTF8(_value); } 
     set { _value = value; } 
    } 
} 
+0

這適用於我。非常感謝。 –