- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们已将 Newtonsoft.Json 从 10.0.3 升级到 11.0.1,之前可以运行的代码不再运行。
我们有以下 JSON:
[{"mail-type":"registration","response":"250 OK id=1UjnNr-gdf-C0 ","invoice-id":,"email":"testuser08@test.com"}]
然后我们调用下面的方法:
var events = JsonConvert.DeserializeObject<Event[]>(jsonEvents);
这在 10.0.3 上运行良好,但在 11.0.1 上不起作用。在此版本上抛出以下异常:
Exception thrown: 'Newtonsoft.Json.JsonReaderException' in Newtonsoft.Json.dll
Additional information: An undefined token is not a valid System.Nullable`1[System.Int64]. Path '[0].invoice-id', line 1.
我尝试将以下选项传递给 DeserializeObject
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
但是还是一样的错误。必须进行哪些更改才能使其在 11.0.1 上运行。我担心我们无法容纳来自第三方 API 的 JSON 输出。
最佳答案
您的 JSON 样本格式不正确。如果我将你的 JSON 上传到 https://jsonlint.com/然后生成以下错误:
Error: Parse error on line 4:
...0 ", "invoice-id": , "email": "testuse
----------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got ','
有问题的行如下:
"invoice-id": ,
根据JSON standard :
和 ,
之间需要有一个值。但是,为什么这在 Json.NET 10.0 中有效?显然这是一个错误,已修复。根据11.0.1 release notes :
Fix - Fixed not erroring when reading undefined for nullable long
因此,如果我们假设您的 Event
类型如下所示:
public partial class Event
{
[JsonProperty("invoice-id")]
public long? InvoiceId { get; set; }
// Other properties as required
}
然后在 10.0 中,您的 JSON 可以使用此类型成功反序列化,但在 11.0 中则不能。但是,如果我们将 InvoiceId
更改为 int?
:
public partial class Event
{
[JsonProperty("invoice-id")]
public int? InvoiceId { get; set; }
// Other properties as required
}
两个版本都失败了。因此,修复似乎一直在处理 int?
和 long?
。
理想情况下,您应该要求向您发送此类 JSON 的人对其进行修复,使其符合 http://www.json.org/ 所定义的格式。和 RFC 8259 .如果您仍然需要以与 Json.NET 10.0 相同的方式解析此类 JSON,则可以引入 TolerantNullableLongConverter
,如下所示:
public class TolerantNullableLongConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(long?);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
if (reader.TokenType == JsonToken.Undefined)
return null;
if (reader.Value is long)
return reader.Value;
// string or int or decimal or ...
return serializer.Deserialize<long>(reader);
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
并将其应用于您的类型,如下所示:
public partial class Event
{
[JsonProperty("invoice-id")]
[JsonConverter(typeof(TolerantNullableLongConverter))]
public long? InvoiceId { get; set; }
// Other properties as required
}
关于c# - Newtonsoft.Json v11 - DeserializeObject 抛出 JsonReaderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49045501/
这个问题已经有答案了: JsonConvert.DeserializeObject could not convert string to DateTime when using non-us dat
我有一个如下所示的 JSON 响应 { "msg": "1", "code": "2", "data": [ { "a": "3",
我想在我的应用程序加载时使用 JSON.Net 来处理配置文件的解析。将所有 KVP 保持在同一范围内绝对没问题。但是,我想将其分解为子类别,例如 Settings.WebServer、Setting
这个问题在这里已经有了答案: Deserializing nested JSON structure to a flattened class with Json.NET using annotat
我知道有很多关于 JSON 的问题遍布整个互联网和 StackOverflow。但是我无法让我的 JSON 正常工作,所以我希望我能在这里得到一些帮助。[使用 C#、Visual Studio] 我有
所有这些都来自https://github.com/JamesNK/Newtonsoft.Json/issues/469 发在这里是因为我先是在SO上看,没有看到任何东西,所以我在项目的GitHub页
我收到一个无效的强制转换异常,表明指定的强制转换无效。在这条线上: RootObject mountain = JsonConvert.DeserializeObject(json1); 来自docu
我有以下来自 Web 服务的 JSON 对象 { "room":{ "name":"Thunderdome", "created_at":"2012/04/15 00:3
我想将我现有的枚举属性标记为过时并添加新的以实现相同的功能。因此,我的项目中有两个枚举(新的和标记过时的)可用。 在使用 jsonconvert.deserializeobject 函数序列化此枚举值
我从网络请求中获取一个 JSON 编码的字符串。 字符串像这样返回 "{\"key\":\"value\"}" 当我尝试使用来自 JsonConvert 的 DeserializeObject 解析它
这个问题在这里已经有了答案: Json.NET case-sensitive deserialization (1 个回答) 关闭 6 年前。 我正在尝试将字符串内容反序列化为对象,但我希望内容区分
我有一些继承,需要自定义 JsonConverter 进行反序列化。我现在使用一种非常直接的方法,根据某些属性的存在来确定类型。 重要说明:在我的实际代码中,我无法触及DeserializeObjec
我有这样的 json 字符串输出: 字符串 apiResult = { "error":[], "result":{ "RARAGA":{ "a":["4",
这个问题在这里已经有了答案: Detect if deserialized object is missing a field with the JsonConvert class in Json.N
我有一个来自网络服务的结果,字符串结果是: {"status":"success","data":{"address":"aa@aa.aa","unconfirmed":[{"tx":"cb2f252
Newtonsoft.Json.DeserializeObject 会抛出哪些异常?我想处理它们。 http://james.newtonking.com/json/help/?topic=html/
我有以下类定义: public class Tag { public Guid? TagId { get; set; } public string TagText { get; se
我正在编写一个解决方案,其中包含一个 ASP.NET Web API (.NET 4.6.2)(又名后端)、一个 Web API 客户端实现 PCL(即中间件)和 Xamarin.Forms 项目(即
我有这个对象 public class ConversationAPI { [JsonProperty(PropertyName = "lU")] public DateTime La
在 Xamarin 项目中,我有包含以下代码的 PCL 库。 我们定义一个 ConcurrentQueue .消费者在对象初始化时为此 Task已附上: _syncConsumer = new Tas
我是一名优秀的程序员,十分优秀!