C# JObject.Load JsonReaderException
我有这样的想法:C# JObject.Load JsonReaderException,c#,.net,json,json.net,C#,.net,Json,Json.net,我有这样的想法: { "_id":{ "$oid":"5b7bc6acc223c11047485dd5" }, "id":"28679e7d-0bca-40b0-b033-044df2bb1b47", "type":"some string" } 以及该类别: public class Foo { private readonly JObject _json; internal Foo(JObject data) {
{
"_id":{
"$oid":"5b7bc6acc223c11047485dd5"
},
"id":"28679e7d-0bca-40b0-b033-044df2bb1b47",
"type":"some string"
}
以及该类别:
public class Foo
{
private readonly JObject _json;
internal Foo(JObject data)
{
_json = data;
}
public override Guid Id => (_json["id"]).ToObject<Guid>();
public override string Type => _json["type"]?.ToString();
}
正如您所看到的,我的json有字段\u id
,而Foo
没有。当我打电话时
JsonConvert.DeserializeObject<Foo>(jsonString);
JsonConvert.DeserializeObject(jsonString);
我得到一个例外:
'Newtonsoft.Json.JsonReaderException:'分析值时遇到意外字符:O.Path'_id',第1行,位置10'。'
是否可以避免此异常并正确加载json 以下json字符串
{
"_id":{
"$oid":"5b7bc6acc223c11047485dd5"
},
"id":"28679e7d-0bca-40b0-b033-044df2bb1b47",
"type":"some string"
}
可以映射到以下类:
public class Foo
{
[JsonProperty("_id")]
public FooId FooId { get; set; }
[JsonProperty("id")]
public Guid Id { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
}
public class FooId
{
[JsonProperty("$oid")]
public string Oid { get; set; }
}
测试代码:
using System;
using Newtonsoft.Json;
class Program
{
static void Main(string[] args)
{
string json = @"{
""_id"":{
""$oid"":""5b7bc6acc223c11047485dd5""
},
""id"":""28679e7d-0bca-40b0-b033-044df2bb1b47"",
""type"":""some string""
}";
var foo = JsonConvert.DeserializeObject<Foo>(json);
Console.Read();
}
}
使用系统;
使用Newtonsoft.Json;
班级计划
{
静态void Main(字符串[]参数)
{
字符串json=@{
“”_id“”:{
$oid:“5b7bc6acc223c11047485dd5”
},
“id”:“28679e7d-0bca-40b0-b033-044df2bb1b47”,
“”类型“”:“”某些字符串“”
}";
var foo=JsonConvert.DeserializeObject(json);
Console.Read();
}
}
如果您不需要私有只读作业对象\u json除了Id
和Type
的getter之外,code>属性可以通过直接反序列化到Foo
来简化代码,如下所示:
var json = "some json";
var foo = JsonConvert.DeserializeObject<Foo>(json);
更改您的Foo
课程:
public class Foo
{
[JsonProperty("id")]
public override Guid Id {get;set;}
[JsonProperty("type")]
public override string Type {get;set;}
}
需要JsonProperty
属性,因为json字符串中的元素键与Foo
类中的元素键不同(区分大小写)
然后可以像这样反序列化json:
var json = "some json";
var foo = JsonConvert.DeserializeObject<Foo>(json);
var json=“some json”;
var foo=JsonConvert.DeserializeObject(json);
json\u id
元素被忽略
这样做时,您可以创建自定义转换器FooConverter
,您的Foo
类更干净。我不认为\u id
的名称是这里的问题。很可能是$oid
。创建JObject
而不将json直接反序列化到类中有什么特殊原因吗?$oid
也应该是guid吗?您可能在尝试反序列化具有不同名称的2个GUI时遇到问题formats@RuiJarimba\u id和$oid应该被忽略。您是否可以在id
和Type
的getter之外的任何地方使用Foo
的JObject
属性?此代码正常工作。阅读并创建一个。