Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JObject.Load JsonReaderException_C#_.net_Json_Json.net - Fatal编程技术网

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 jsonId
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
属性?此代码正常工作。阅读并创建一个。