gpt4 book ai didi

java - 反序列化 JSON 时如何删除或忽略 Java 类型提示?

转载 作者:行者123 更新时间:2023-12-01 11:18:10 26 4
gpt4 key购买 nike

我正在构建一个需要使用来自第三方 Web 服务的 JSON 的 C# 应用程序。第三方似乎正在使用 Java 生成 JSON,因为返回的字符串中有 Java 类型信息(例如下面的“com.company.RegistrationDetail”)。具体来说,复杂对象以“@type”属性开头:

...
"registration": {
"@type": "com.company.RegistrationDetail",
"id": "regdw000000000003551",
"displayName": "Registration 3551"
},
...

显然,这个“@type”值在 C# 中对我来说没有用。但由于它只是一个属性,因此很容易被忽视。数组是另一回事:

...
"warnings": [
"java.util.ArrayList",
[
"Warning #1",
"Warning #2"
]
],
...

“警告”数组表示为包含类型名称的字符串,然后是包含实际警告项的嵌套数组。这会干扰我的反序列化器 (JSON.NET),因为“警告”中的项目类型不一致。

我可以将 JSON 的每个 block 反序列化为 JObject 或 JArray,但这确实很乏味,因为 Web 服务的输出非常复杂,具有多个级别的嵌套对象和数组。理想情况下,我希望能够使用类似 json2csharp 的东西从 JSON 输出生成 C# 类,然后立即反序列化所有内容,如下所示:

JsonConvert.DeserializeObject<GeneratedResponseClass>(jsonResponseData);

这是 Java 中众所周知的编码技术(即将类型信息嵌入到 JSON 中)吗?在 C# 中反序列化 JSON 时,有什么方法可以去除或忽略此 Java 类型信息吗?

这是一个更完整的示例(删除了许多多余的属性和嵌套对象)。我想获取 orderDetail -> orderItems[0] -> Registration -> id 的值。

{
"@type":"com.company.learning.services.registration.OrderResult",
"orderId":"intor000000000004090",
"orderDetail":{
"@type":"com.company.learning.services.registration.OrderDetail",
"orderStatus":"Confirmed",
"orderItems":[
"list",
[
{
"@type":"com.company.learning.services.registration.OrderItemDetail",
"registration":{
"@type":"ServiceObjectReference",
"id":"regdw000000000003551",
"displayName":""
},
"quantity":null,
"itemStatusDescription":"Registered"
}
]
],
"orderContact":"Sample Person",
"orderNumber":"00003911",
"orderDate":{
"@type":"com.company.customtypes.DateWithLocale",
"date":1437425816000,
"locale":"20-JUL-2015",
"timeInUserTimeZone":"3:56 PM",
"timeInCustomTimeZone":null,
"dateInCustomTimeZone":null,
"customTimeZoneDate":0,
"timeInLocale":"4:56 PM",
"dateInUserTimeZone":"20-JUL-2015"
}
}
}

最佳答案

根据您的最终 json,您的模型将是:

public class Registration
{
public string id { get; set; }
public string displayName { get; set; }
}

public class Order
{
public Registration registration { get; set; }
public object quantity { get; set; }
public string itemStatusDescription { get; set; }
}

public class OrderDate
{
public long date { get; set; }
public string locale { get; set; }
public string timeInUserTimeZone { get; set; }
public object timeInCustomTimeZone { get; set; }
public object dateInCustomTimeZone { get; set; }
public int customTimeZoneDate { get; set; }
public string timeInLocale { get; set; }
public string dateInUserTimeZone { get; set; }
}

public class OrderDetail
{
public string orderStatus { get; set; }
public List<Order> orderItems { get; set; }
public string orderContact { get; set; }
public string orderNumber { get; set; }
public OrderDate orderDate { get; set; }
}

public class RootObject
{
public string orderId { get; set; }
public OrderDetail orderDetail { get; set; }
}

这是转换器类

public class JavaArrayConverter : JsonConverter
{
Type _Type = null;
public override bool CanConvert(Type objectType)
{
if(objectType.IsGenericType)
{
_Type = typeof(List<>).MakeGenericType(objectType.GetGenericArguments()[0]);
return objectType == _Type;
}
return false;
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jArray = JArray.Load(reader);
return jArray[1].ToObject(_Type); //jArray[0] is the "java-type"
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

现在您可以反序列化为:

var root = JsonConvert.DeserializeObject<RootObject>(DATA, new JavaArrayConverter());

关于java - 反序列化 JSON 时如何删除或忽略 Java 类型提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31545908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com