Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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_Datacontractserializer - Fatal编程技术网

C# 将词典序列化<;字符串,类型>;并从JSON字符串中删除键/值

C# 将词典序列化<;字符串,类型>;并从JSON字符串中删除键/值,c#,json,datacontractserializer,C#,Json,Datacontractserializer,我有以下代码片段,其中我将对象序列化为JSON。代码运行正常,但我想从JSON字符串中删除Key和Value关键字 电流输出: { "Description":"test", "RoomTypes":[ { "Key":"A", "Value":{ "Name":"Delux" } }, { "Key":"B", "Value":{

我有以下代码片段,其中我将对象序列化为JSON。代码运行正常,但我想从JSON字符串中删除
Key
Value
关键字

电流输出:

{
   "Description":"test",
   "RoomTypes":[
      {
         "Key":"A",
         "Value":{
            "Name":"Delux"
         }
      },
      {
         "Key":"B",
         "Value":{
            "Name":"Non delux"
         }
      }
   ],
   "Url":"http:\/\/test.com"
}
{
   "Description":"test",
   "RoomTypes":[
      {
         "A":{
            "Name":"Delux"
         }
      },
      {
         "B":{
            "Name":"Non delux"
         }
      }
   ],
   "Url":"http:\/\/test.com"
}
namespace ConsoleApplication1
{
    [DataContract]
    public class Room
    {
        [DataMember]
        public string Url { get; set; }
        [DataMember]
        public string Description { get; set; }
        [DataMember]
        public Dictionary<string, RoomTypes> RoomTypes { get; set; }
    }

    [DataContract]
    public class RoomTypes
    {
        [DataMember]
        public string Name { get; set; }
    }

    public class Test
    {
        static void Main(string[] args)
        {
            Room room = new Room { Url = "http://test.com", Description="test" };
            RoomTypes roomType1 = new RoomTypes() { Name = "Delux" };
            RoomTypes roomType2 = new RoomTypes() { Name = "Non delux" };
            room.RoomTypes = new Dictionary<string, RoomTypes>();
            room.RoomTypes["A"] = roomType1;
            room.RoomTypes["B"] = roomType2;

            DataContractJsonSerializer dataContractSer = 
                   new DataContractJsonSerializer(typeof(Room));
            StringBuilder sb = new StringBuilder();
            MemoryStream ms = new MemoryStream();
            dataContractSer.WriteObject(ms, room);
            var result = Encoding.UTF8.GetString(ms.ToArray());
            Console.WriteLine(result);
        }
    }
}
Dictionary<string, int> points = new Dictionary<string, int>
{
    { "James", 9001 },
    { "Jo", 3474 },
    { "Jess", 11926 }
};

string json = JsonConvert.SerializeObject(points, Formatting.Indented);

Console.WriteLine(json);
// {
//   "James": 9001,
//   "Jo": 3474,
//   "Jess": 11926
// }
所需输出:

{
   "Description":"test",
   "RoomTypes":[
      {
         "Key":"A",
         "Value":{
            "Name":"Delux"
         }
      },
      {
         "Key":"B",
         "Value":{
            "Name":"Non delux"
         }
      }
   ],
   "Url":"http:\/\/test.com"
}
{
   "Description":"test",
   "RoomTypes":[
      {
         "A":{
            "Name":"Delux"
         }
      },
      {
         "B":{
            "Name":"Non delux"
         }
      }
   ],
   "Url":"http:\/\/test.com"
}
namespace ConsoleApplication1
{
    [DataContract]
    public class Room
    {
        [DataMember]
        public string Url { get; set; }
        [DataMember]
        public string Description { get; set; }
        [DataMember]
        public Dictionary<string, RoomTypes> RoomTypes { get; set; }
    }

    [DataContract]
    public class RoomTypes
    {
        [DataMember]
        public string Name { get; set; }
    }

    public class Test
    {
        static void Main(string[] args)
        {
            Room room = new Room { Url = "http://test.com", Description="test" };
            RoomTypes roomType1 = new RoomTypes() { Name = "Delux" };
            RoomTypes roomType2 = new RoomTypes() { Name = "Non delux" };
            room.RoomTypes = new Dictionary<string, RoomTypes>();
            room.RoomTypes["A"] = roomType1;
            room.RoomTypes["B"] = roomType2;

            DataContractJsonSerializer dataContractSer = 
                   new DataContractJsonSerializer(typeof(Room));
            StringBuilder sb = new StringBuilder();
            MemoryStream ms = new MemoryStream();
            dataContractSer.WriteObject(ms, room);
            var result = Encoding.UTF8.GetString(ms.ToArray());
            Console.WriteLine(result);
        }
    }
}
Dictionary<string, int> points = new Dictionary<string, int>
{
    { "James", 9001 },
    { "Jo", 3474 },
    { "Jess", 11926 }
};

string json = JsonConvert.SerializeObject(points, Formatting.Indented);

Console.WriteLine(json);
// {
//   "James": 9001,
//   "Jo": 3474,
//   "Jess": 11926
// }
我的测试代码:

{
   "Description":"test",
   "RoomTypes":[
      {
         "Key":"A",
         "Value":{
            "Name":"Delux"
         }
      },
      {
         "Key":"B",
         "Value":{
            "Name":"Non delux"
         }
      }
   ],
   "Url":"http:\/\/test.com"
}
{
   "Description":"test",
   "RoomTypes":[
      {
         "A":{
            "Name":"Delux"
         }
      },
      {
         "B":{
            "Name":"Non delux"
         }
      }
   ],
   "Url":"http:\/\/test.com"
}
namespace ConsoleApplication1
{
    [DataContract]
    public class Room
    {
        [DataMember]
        public string Url { get; set; }
        [DataMember]
        public string Description { get; set; }
        [DataMember]
        public Dictionary<string, RoomTypes> RoomTypes { get; set; }
    }

    [DataContract]
    public class RoomTypes
    {
        [DataMember]
        public string Name { get; set; }
    }

    public class Test
    {
        static void Main(string[] args)
        {
            Room room = new Room { Url = "http://test.com", Description="test" };
            RoomTypes roomType1 = new RoomTypes() { Name = "Delux" };
            RoomTypes roomType2 = new RoomTypes() { Name = "Non delux" };
            room.RoomTypes = new Dictionary<string, RoomTypes>();
            room.RoomTypes["A"] = roomType1;
            room.RoomTypes["B"] = roomType2;

            DataContractJsonSerializer dataContractSer = 
                   new DataContractJsonSerializer(typeof(Room));
            StringBuilder sb = new StringBuilder();
            MemoryStream ms = new MemoryStream();
            dataContractSer.WriteObject(ms, room);
            var result = Encoding.UTF8.GetString(ms.ToArray());
            Console.WriteLine(result);
        }
    }
}
Dictionary<string, int> points = new Dictionary<string, int>
{
    { "James", 9001 },
    { "Jo", 3474 },
    { "Jess", 11926 }
};

string json = JsonConvert.SerializeObject(points, Formatting.Indented);

Console.WriteLine(json);
// {
//   "James": 9001,
//   "Jo": 3474,
//   "Jess": 11926
// }
命名空间控制台应用程序1
{
[数据合同]
公共教室
{
[数据成员]
公共字符串Url{get;set;}
[数据成员]
公共字符串说明{get;set;}
[数据成员]
公共字典类型{get;set;}
}
[数据合同]
公共教室类型
{
[数据成员]
公共字符串名称{get;set;}
}
公开课考试
{
静态void Main(字符串[]参数)
{
房间=新房间{Url=”http://test.com,Description=“test”};
RoomTypes roomType1=新的RoomTypes(){Name=“Delux”};
RoomTypes roomType2=新的RoomTypes(){Name=“Non delux”};
room.RoomTypes=新字典();
room.RoomTypes[“A”]=roomType1;
房间类型[“B”]=房间类型2;
DataContractJsonSerializer dataContractSer=
新DataContractJsonSerializer(房间类型);
StringBuilder sb=新的StringBuilder();
MemoryStream ms=新的MemoryStream();
数据合同写入对象(ms,房间);
var result=Encoding.UTF8.GetString(ms.ToArray());
控制台写入线(结果);
}
}
}

有没有办法做到这一点?

这是因为您正在使用字典存储值。您必须编写一个自定义实现和overide序列化/反序列化方法


查看更多详细信息

这并不有趣,但请尝试以下方法:

[Test]
public void Json()
{
         var input = @"{
   ""Description"":""test"",
   ""RoomTypes"":[
      {
         ""Key"":""A"",
         ""Value"":{
            ""Name"":""Delux""
         }
      },
      {
         ""Key"":""B"",
         ""Value"":{
            ""Name"":""Non delux""
         }
      }
   ],
   ""Url"":""http:\/\/test.com""
}";

    var temp = JsonConvert.DeserializeObject<Temp>(input);
    var transform = new Transform
        {
            Description = temp.Description,
            Url = temp.Url,
            RoomTypes = new List<IDictionary<string, Temp.NameObj>>()
        };

    foreach (var group in temp.RoomTypes)
    {
        var dic = new Dictionary<string, Temp.NameObj> {{@group.Key, @group.Value}};
        transform.RoomTypes.Add(dic);
    }

    Console.WriteLine(JsonConvert.SerializeObject(transform));
}

public class Transform
{
    public string Description { get; set; }
    public IList<IDictionary<string, Temp.NameObj>> RoomTypes { get; set; }
    public string Url { get; set; }
}


public class Temp
{
    public string Description { get; set; }
    public IList<GroupObj> RoomTypes { get; set; }
    public string Url { get; set; }

    public class GroupObj
    {
        public string Key { get; set; }
        public NameObj Value { get; set; }
    }

    public class NameObj
    {
        public string Name { get; set; }
    }
}    
[测试]
public-void-Json()
{
变量输入=@“{
“说明”:“测试”,
“房间类型”:[
{
“键”:“A”,
“价值”:{
“名称”:“德鲁克斯”
}
},
{
“键”:“B”,
“价值”:{
“名称”:“非消光”
}
}
],
“Url”“:”“http:\/\/test.com”
}";
var temp=JsonConvert.DeserializeObject(输入);
var变换=新变换
{
描述=温度描述,
Url=临时Url,
RoomTypes=新列表()
};
foreach(临时房间类型中的变量组)
{
var dic=newdictionary{{@group.Key,@group.Value};
transform.RoomTypes.Add(dic);
}
WriteLine(JsonConvert.SerializeObject(transform));
}
公共类转换
{
公共字符串说明{get;set;}
公共IList RoomTypes{get;set;}
公共字符串Url{get;set;}
}
公共类临时工
{
公共字符串说明{get;set;}
公共IList RoomTypes{get;set;}
公共字符串Url{get;set;}
公共类GroupObj
{
公共字符串密钥{get;set;}
public NameObj值{get;set;}
}
公共类NameObj
{
公共字符串名称{get;set;}
}
}    

我们的想法是使用Json.Net的字典序列化来实现所需的结构。

只需使用字符串替换函数修改字符串即可尝试以下操作

>   public string updatejson (string jsonorg)
>     {
>         string updatedjson = "";
>         updatedjson = jsonorg.Replace("\"Key\":", "");
>         updatedjson = updatedjson.Replace("\"Value\":", "");
>         updatedjson = updatedjson.Replace("\",", "\":");
>         updatedjson = updatedjson.Replace("},{", ",");
>         updatedjson = updatedjson.TrimStart('[');
>         updatedjson = updatedjson.TrimEnd(']');
> 
>         return updatedjson;
>     }

我知道您不想使用Json.NET,但说真的,这是为处理Json序列化而构建的库。Json.NET完全满足了您的需求,您只需将其作为一行代码编写即可

(来自文档:)

字典点=新字典
{
{“詹姆斯”,9001},
{“Jo”,3474},
{“Jess”,11926}
};
string json=JsonConvert.SerializeObject(点、格式、缩进);
Console.WriteLine(json);
// {
//“詹姆斯”:9001,
//“Jo”:3474,
//“杰西”:11926
// }

如果您使用的是.NET Framework v4.5或更高版本,则可以将
DataContractJsonSerializerSettings设置为
true
以更接近所需的格式:

var settings = new DataContractJsonSerializerSettings();
settings.UseSimpleDictionaryFormat = true;

var dataContractSer = new DataContractJsonSerializer(typeof(Room), settings);
将问题中的测试代码与上述修改一起使用会产生以下输出,这可能是您正在寻找的(尽管它与问题中所述的期望输出不同):


不使用Json.Net是否可能?我刚刚使用DataContractJsonSerializer对其进行了测试,它不会按照您希望的方式进行序列化。它将返回如下内容:
“RoomTypes”:[[[{“Key”:“A”,“Value”:{“Name”:“Delux”}}]
。如果尝试使用ExpandoObject,它将在序列化级别失败。我不确定如何使用DataContractJsonSerializer完成此操作:(很抱歉,这是一个非常脆弱的解决方案,它会根据源JSON的格式和/或内容产生无效的JSON。例如,请参阅。是的,我知道这件事。我们必须根据需要修改代码。我不是说这是解决方案,我只是分享了解决此类问题的快速方法。@Brian:argh-我只是在我的帖子后才检查…你重新提出了一个3年前的问题…:-)我花了一段时间才找到这个答案。我不想在我的项目中添加另一个依赖项,只是为了能够从JSON文件中读取键值对。谢谢!