在 C# 中反序列化大小为 1 的 JSON 数组
Deserializing a JSON Array of size 1 in c#
我有两个不同的 JSON 对象,其中一个对象略有不同 属性:
string JSONObject1 = "
{
prop1: val1
prop2: {
prop3: val3
prop4: val4
}
}
"
string JSONObject2 = "
{
prop1: val1
prop2: [{
prop3: val3
prop4: val4
}]
}
"
class MyObject
{
string prop1 {get; set;}
MyInnerObject prop2 {get; set;}
}
class MyInnerObject
{
string prop3;
string prop4;
}
JsonConvert.DeserializeObject<MyObject>(JSONObject1) // This works
JsonConvert.DeserializeObject<MyObject>(JSONObject2) // This does not work
如何反序列化 JSONObject2,而不添加新的 class 或对 MyObject 进行修改?
正在更新我的答案,以便为这个问题提供更动态、更可靠的答案。
在处理此解决方案时,OP 问题中提到的问题对我来说变得很明显,但假设考虑了以下项目列表,您可以使用动态 json.
解决此问题
- 提供的json无效
- 提供的 类 不可序列化,因为它们不是 public
- 属性也不可序列化,因为它们也不是 public
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Text;
using System.Threading.Tasks;
namespace commandexample
{
class Program
{
static void Main(string[] args)
{
string JSONObject1 = @"
{
prop1: ""val1"",
prop2: {
prop3: ""val3"",
prop4: ""val4""
}
}";
string JSONObject2 = @"
{
prop1: ""val1"",
prop2:[{
prop3: ""val3"",
prop4: ""val4""
}]
}";
var dyn = JsonConvert.DeserializeObject<dynamic>(JSONObject2);
if (dyn.prop2.GetType().Name == "JArray")
{
dyn.prop2 = dyn.prop2[0];
}
string updatedJson = JsonConvert.SerializeObject(dyn);
MyObject result1 = JsonConvert.DeserializeObject<MyObject>(JSONObject1);
MyObject result2 = JsonConvert.DeserializeObject<MyObject>(updatedJson);
}
public class MyObject
{
public string prop1 { get; set; }
public MyInnerObject prop2 { get; set; }
}
public class MyInnerObject
{
public string prop3;
public string prop4;
}
}
}
原版post
如果您知道该数组将始终只包含一项,而您的 json 文档中只有一个数组,您可以只对方括号的 json 字符串进行字符串替换.这将满足您的特定问题的条件,但如果将来更改文档以添加其他数组属性,则可能会导致问题。真的取决于您的用例。
我认为这是一个数据问题,有人试图阅读由两个独立系统生成的 json 文档,而其中一个系统未正确创建文档。
JSONObject2 = JSONObject2.Replace("[","").Replace("]","");
//then continue with the Deserialization
JsonConvert.DeserializeObject<MyObject>(JSONObject2);
我有两个不同的 JSON 对象,其中一个对象略有不同 属性:
string JSONObject1 = "
{
prop1: val1
prop2: {
prop3: val3
prop4: val4
}
}
"
string JSONObject2 = "
{
prop1: val1
prop2: [{
prop3: val3
prop4: val4
}]
}
"
class MyObject
{
string prop1 {get; set;}
MyInnerObject prop2 {get; set;}
}
class MyInnerObject
{
string prop3;
string prop4;
}
JsonConvert.DeserializeObject<MyObject>(JSONObject1) // This works
JsonConvert.DeserializeObject<MyObject>(JSONObject2) // This does not work
如何反序列化 JSONObject2,而不添加新的 class 或对 MyObject 进行修改?
正在更新我的答案,以便为这个问题提供更动态、更可靠的答案。 在处理此解决方案时,OP 问题中提到的问题对我来说变得很明显,但假设考虑了以下项目列表,您可以使用动态 json.
解决此问题- 提供的json无效
- 提供的 类 不可序列化,因为它们不是 public
- 属性也不可序列化,因为它们也不是 public
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Text;
using System.Threading.Tasks;
namespace commandexample
{
class Program
{
static void Main(string[] args)
{
string JSONObject1 = @"
{
prop1: ""val1"",
prop2: {
prop3: ""val3"",
prop4: ""val4""
}
}";
string JSONObject2 = @"
{
prop1: ""val1"",
prop2:[{
prop3: ""val3"",
prop4: ""val4""
}]
}";
var dyn = JsonConvert.DeserializeObject<dynamic>(JSONObject2);
if (dyn.prop2.GetType().Name == "JArray")
{
dyn.prop2 = dyn.prop2[0];
}
string updatedJson = JsonConvert.SerializeObject(dyn);
MyObject result1 = JsonConvert.DeserializeObject<MyObject>(JSONObject1);
MyObject result2 = JsonConvert.DeserializeObject<MyObject>(updatedJson);
}
public class MyObject
{
public string prop1 { get; set; }
public MyInnerObject prop2 { get; set; }
}
public class MyInnerObject
{
public string prop3;
public string prop4;
}
}
}
原版post
如果您知道该数组将始终只包含一项,而您的 json 文档中只有一个数组,您可以只对方括号的 json 字符串进行字符串替换.这将满足您的特定问题的条件,但如果将来更改文档以添加其他数组属性,则可能会导致问题。真的取决于您的用例。
我认为这是一个数据问题,有人试图阅读由两个独立系统生成的 json 文档,而其中一个系统未正确创建文档。
JSONObject2 = JSONObject2.Replace("[","").Replace("]","");
//then continue with the Deserialization
JsonConvert.DeserializeObject<MyObject>(JSONObject2);