2017-06-29 153 views
2

我試圖解析一個C#對象包含一個JSON的字符串,看起來像這樣: 我知道這不是真正有效的JSON,但我不能選擇它,它發送一個裝置。這就是爲什麼我試圖用{}替換[]以使其看起來像一個有效的對象。解析沒有屬性名稱的Json到C#

[2, "2", "text", {Object}] 

我創建了以下類:

public class MyClass 
{ 
    [JsonProperty(Order = 0)] 
    public int TypeRequest { get; set; } 

    [JsonProperty(Order = 1)] 
    public string UniqueID { get; set; } 

    [JsonProperty(Order = 2)] 
    public string Action { get; set; } 

    [JsonProperty(Order = 3)] 
    public JObject Payload { get; set; } 

} 

我想解析{}對象後(我首先要知道的「操作」屬性,因爲對象依賴於動作) 。

到目前爲止,我已經做了:

string userMessage = "[2, "2", "text", {Object}]"; 
if (userMessage.Length > 2) 
{ 
    // We need to remove the first [ and the last ] to be able to parse into a json object 
    StringBuilder sb = new StringBuilder(userMessage); 
    sb[0] = '{'; 
    sb[sb.Length - 1] = '}'; 
    userMessage = sb.ToString(); 
} 

JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 
MyClass objectJSON = jsonSerializer.Deserialize<MyClass >(userMessage); 

但它不工作我得到以下異常:

無效的對象傳入, ':' 或 '}' 的預期。 (3):{對象}}

我也有試過JObject.Parse而不是和我:

無效的JavaScript屬性標識字符:,。路徑'',第1行, 位置2.

你知道該怎麼做嗎?我想避免必須用逗號分割我的JSON,並有最乾淨的方式來做到這一點。

+1

你的userMessage應該用大括號'{}'而不是方括號'[]'包裝,因爲這會表明它是一個數組。它然後也需要屬性名稱。 – TylerBrinkley

+1

嘗試使用以下方法驗證您的JSOn:https://jsonformatter.curiousconcept.com/ –

+2

如果有方法將輸入數據更改爲有效的JSON - 這將是最佳選擇,否則需要定製解析器以獲取{object}。 – Vladimir

回答

2

因爲{Object}這不是真正有效的JSON,所以我刪除了它。您可以在技術上做json.Replace("{Object}", "something else")以使其更容易。因爲你處理數組中的不同類型,所以它可能不是一個一步的過程。這裏有一個想法:

var json = "[2, \"2\", \"text\"]"; 
var array = JsonConvert.DeserializeObject<JArray>(json); 

foreach (var item in array) 
{ 
    switch (item.Type) 
    { 
     case JTokenType.Integer: 
      // todo: your parsing code 
      break; 
     case JTokenType.String: 
      break; 
     // etc. 
    } 
} 

我用JSON.NET庫來解析JSON。您可以使用的NuGet安裝:

Install-Package Newtonsoft.Json


如果可以的話,我建議你修復JSON源爲您提供可以被解析到一個對象,而無需使用一個有效的JSON如JTokenJArray,JObject等低級類

+1

謝謝,我應該在之前告訴過它。我不選擇它由設備發送的消息。 – user2088807