在 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.

解决此问题
  1. 提供的json无效
  2. 提供的 类 不可序列化,因为它们不是 public
  3. 属性也不可序列化,因为它们也不是 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);