【问题标题】:Deserialize malformed JSON with JSON.NET [duplicate]使用 JSON.NET 反序列化格式错误的 JSON [重复]
【发布时间】:2015-08-30 23:57:03
【问题描述】:

我有一个如下所示的 JSON sn-p:

{"123":{"name":"test","info":"abc"}}

123 是一个 ID,可以根据每个请求进行更改。这超出了我的控制范围。

我想使用 JSON.NET 反序列化 JSON。我试过了:

 User u = JsonConvert.DeserializeObject<User>(json);

但是,除非我像这样定义 JsonProperty 属性,否则这不起作用:

[JsonProperty("123")]
public string ID { get; set; }

但我当然不能真正做到这一点,因为 ID 123 会在每次请求时更改。

如何使用 JSON.NET 读取 ID 属性并将其应用于 ID 类?

【问题讨论】:

  • 它适用于KeyValuePair&lt;string, object&gt;。您可以尝试在临时的 object 缓冲区中对其进行反序列化,然后将其映射到您的 User 实例。
  • 不是格式错误;只是笨拙地形成。基本上它是 的 KVP,其中用户具有属性 'name' 和 'info'
  • 我想,在你的类结构中必须定义第一类 RootObject 。在 Rootobject 类中,您必须将所有 json 属性声明为 get set 方法。
  • 正如所指出的,KeyValuePair&lt;string, object&gt; 不起作用。根据@YuvalItzchakov 的回答,使用Dictionary 可以解决问题。

标签: c# json.net


【解决方案1】:

试试这个:

var json = "{\"123\":{\"name\":\"test\",\"info\":\"abc\"}}";

var rootObject = JsonConvert.DeserializeObject<Dictionary<string, User>>(json);
var user = rootObject.Select(kvp => new User 
                                    { ID = kvp.Key, 
                                      Name = kvp.Value.Name, 
                                      Info = kvp.Value.Info 
                                    }).First();

这确实有一些不必要的开销,但考虑到情况,它会这样做。

【讨论】:

  • 同意但有效 - 谢谢。
  • 这个解决方案其实很漂亮!对我来说工作得很好,即使 Value 部分是一个对象数组!
【解决方案2】:

我会这样做:

dynamic result = JsonConvert.DeserializeObject(json);

var myObject = result as JObject;
var properties = myObject.Properties();
var property = properties.FirstOrDefault(); // take first element 
string name = property.Name;

foreach (var item in properties)
{
    var jProperty = item as JProperty;
    var nestedJson = jProperty.Value.ToString();
    dynamic nestedResult = JsonConvert.DeserializeObject(nestedJson); // or put it into a model/data structure
}

【讨论】:

  • 谢谢 - 现在获取实际用户数据很有趣但很棘手。
  • 我知道...但是您也可以反序列化嵌套对象...更新了我的答案。
【解决方案3】:

如何将 JSON 形成如下(如果允许更改 JSON 模式):

{
    "ID": "123",
    "Properties":{"name":"test","info":"abc"}
}

这种方式一定是可以的。

【讨论】:

  • 抱歉不允许 - 我在问题中加粗了 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多