Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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# 反序列化数组时如何获取对象json_C#_Json_Serialization_Json.net - Fatal编程技术网

C# 反序列化数组时如何获取对象json

C# 反序列化数组时如何获取对象json,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我有一个传入的JSON,它由一些对象组成的数组,比如说,Foo。我将它们反序列化为 result = JsonConvert.DeserializeObject<List<Foo>>(message); 但是我不知道如何才能用JSON.Net来填充这样一个字段 UPD 我会澄清我想要的。假设我收到JSON: [{"MyInt":1,"MyBool":0},{"MyInt":2,"MyBool":0},{"MyInt":3,"MyBool":1}] 下面是3个对象的数组

我有一个传入的JSON,它由一些对象组成的数组,比如说,
Foo
。我将它们反序列化为

result = JsonConvert.DeserializeObject<List<Foo>>(message);
但是我不知道如何才能用JSON.Net来填充这样一个字段

UPD 我会澄清我想要的。假设我收到JSON:

[{"MyInt":1,"MyBool":0},{"MyInt":2,"MyBool":0},{"MyInt":3,"MyBool":1}]
下面是3个对象的数组,我希望在反序列化时,将json的相应部分添加到对象中,以便:

第一个对象将包含
{“MyInt”:1,“MyBool”:0}

第二个对象将包含
{“MyInt”:2,“MyBool”:0}

第三个对象将包含
{“MyInt”:3,“MyBool”:1}

在其
JSON
属性中


我将非常感激任何帮助

这是一种方法,但它不维护精确的原始JSON-但它提供了原始JSON的静态记录(但没有原始值的精确格式-即Bool可能为0/1或true/false):

var message=@“[{”“MyInt”“:1”,“MyBool”“:0},{”“MyInt”“:2”,“MyBool”“:0},{”“MyInt”“:3”,“MyBool”“:1}]”;
var foos=JsonConvert.DeserializeObject(消息);
var t=JsonConvert.SerializeObject(foos[0]);
foos=foos.Select(s=>newfoo(){MyBool=s.MyBool,MyInt=s.MyInt,JSON=JsonConvert.SerializeObject}).ToList();

如果你正在处理大量的foo,那么你可能想找到一种更有效的方法。可能有一种方法可以使用linq“更新”,而不是创建新列表。

好的,我找到了答案。我不知道我可以将消息反序列化为JArray,然后枚举它(干得好,newtonsoft:)。以下是我喜欢的:

if (tokenType is JArray)
                {
                    var arr = JsonConvert.DeserializeObject(message) as JArray;
                    foreach (var item in arr)
                    {
                        try
                        {
                            var agentParameter = item.ToObject<Foo>();
                            agentParameter.JSON = item.ToString();
                            result.Add(agentParameter);
                        }
                        catch (Exception)
                        {
                            LogProvider.Error(string.Format("Failed to Deserialize message. Message text: \r\n {0}", item.ToString()));
                        }
                    }
                }
if(令牌类型为JArray)
{
var arr=JsonConvert.DeserializeObject(消息)作为JArray;
foreach(arr中的var项目)
{
尝试
{
var agentParameter=item.ToObject();
agentParameter.JSON=item.ToString();
结果。添加(agentParameter);
}
捕获(例外)
{
LogProvider.Error(string.Format(“未能反序列化消息。消息文本:\r\n{0}”,item.ToString());
}
}
}

当您反序列化到一个Foo列表时,是否希望在每个Foo实例中都有一份完整的JSON文本副本?你打算再次序列化Foo的列表吗?@Ulric否,我想将json中的objects部分添加到它的字段中。请参阅我的文章编辑以了解解释Brian建议的类似解决方案,我需要的正是原始JSON,而不是重新序列化的JSON。从技术上讲,它将存储原始JSON。如果JSON有问题,它将不会反序列化——但如果没有问题,重新序列化的值将(出于所有目的)匹配。(Brian建议的问题是更改属性会更改JSON。)但如果这不够“准确”,那么NP:@Ulric就不行了。看见请注意,原始文件中的布尔值为
1
0
,但输出文件中的布尔值为
true
false
。还要注意,输出中包含了
JSON
成员,这是原始版本中没有的。@Brian啊,是的-你是对的。我以前没有注意到这一点。>为将来而归档reference@Ulric好吧,我的问题仍然是,我可以收到一个非常大的JSON(我真的可以,而且很多次),在一个项目上失败,丢失其他项目(在反序列化失败期间),然后我必须记录整个JSON。。。我是否可以以某种方式将初始数组“拆分”为项,然后逐个解析它们?
item.ToString()
还会重新序列化对象。它不会返回原始JSON。@BrianRogers,这是一个pitty,你完全正确:(我可以从JToken中提取原始JSON吗?我不这么认为——我只是在研究这个问题,但JSON.Net似乎在解析原始JSON时并没有挂起。一旦它被转换成值(或JToken)原始的已被丢弃。您可能需要寻找另一个解析器。@BrianRogers Brian,我测试了我的解决方案,当我将一些不正确的值粘贴到数组中的json项时,ToObject抛出异常,ToString也返回原始json。所以我用try-catch将其打包,现在我得到了我想要的。非常感谢您的帮助!没问题;我很高兴看到您您能够找到一个适合您的解决方案。
var message = @"[{""MyInt"":1,""MyBool"":0},{""MyInt"":2,""MyBool"":0},{""MyInt"":3,""MyBool"":1}]";
var foos = JsonConvert.DeserializeObject<List<Foo>>(message);
var t = JsonConvert.SerializeObject(foos[0]);
foos = foos.Select(s => new Foo() { MyBool = s.MyBool, MyInt = s.MyInt, JSON = JsonConvert.SerializeObject(s) }).ToList();
if (tokenType is JArray)
                {
                    var arr = JsonConvert.DeserializeObject(message) as JArray;
                    foreach (var item in arr)
                    {
                        try
                        {
                            var agentParameter = item.ToObject<Foo>();
                            agentParameter.JSON = item.ToString();
                            result.Add(agentParameter);
                        }
                        catch (Exception)
                        {
                            LogProvider.Error(string.Format("Failed to Deserialize message. Message text: \r\n {0}", item.ToString()));
                        }
                    }
                }