【问题标题】:Parse Json without property names to C#将没有属性名称的 Json 解析为 C#
【发布时间】:2017-06-29 14:40:18
【问题描述】:

我正在尝试将包含如下 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): {对象}}

我也尝试过使用 JObject.Parse,但我得到了:

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

你知道怎么做吗?我想避免用逗号分隔我的 JSON,并采用最简洁的方式。

【问题讨论】:

  • 您的 userMessage 应该用大括号 {} 而不是方括号 [] 括起来,因为这表明它是一个数组。然后它还需要属性名称。
  • 尝试验证您的 JSOn:jsonformatter.curiousconcept.com
  • 如果有办法将输入数据更改为有效的 JSON - 这将是最好的选择,否则需要自定义解析器来获取 {object}。
  • 应该类似于:{ "TypeRequest": 2, "UniqueID": "2", "Action": "text", "Payload": {} }
  • 我没有选择它由设备发送的消息,我应该准确地说对不起。

标签: c# json parsing json.net


【解决方案1】:

由于{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,而无需使用 JTokenJArrayJObject 等低级类等等

【讨论】:

  • 谢谢,我早该告诉的。我不选择它由设备发送的消息。
猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多