我正在尝试将包含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,并采用最干净的方式来完成它。
答案 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
等。