将没有属性名称的Json解析为C#

时间:2017-06-29 14:40:19

标签: c# json parsing json.net

我正在尝试将包含JSON的字符串解析为C#对象,如下所示: 我知道这不是真正有效的json但是我不能选择它,它是由设备发送的。这就是为什么我试图用{}替换[]使它看起来像一个有效的对象

[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; }

}

我想稍后解析{Object}(我首先需要知道“Action”属性,因为对象取决于操作)。

到目前为止,我已经完成了:

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):{Object}}

我也试过了JObject.Parse而我得到了:

  

无效的JavaScript属性标识符:。路径'',第1行,   位置2。

你知道怎么做吗?我想避免用逗号分割我的JSON,并采用最干净的方式来完成它。

1 个答案:

答案 0 :(得分:3)

由于{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,而不使用JToken等{{1}等低级别类},JArray等。