标签: datacontractjsonserializer

如何将C#匿名类型序列化为JSON字符串?

我正在尝试使用以下代码将匿名类型序列化为JSON:

var serializer = new DataContractJsonSerializer(thing.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, thing);
var json = Encoding.Default.GetString(ms.ToArray()); 
Run Code Online (Sandbox Code Playgroud)

但是,执行此操作时会出现以下异常:

类型'<> f__AnonymousType1`3 [System.Int32,System.Int32,System.Object []]'无法序列化.请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.

我不能将属性应用于匿名类型(据我所知).有没有其他方法来进行此序列化或我错过了什么?

c# json anonymous-types json-serialization datacontractjsonserializer

158
推荐指数
7
解决办法
11万
查看次数

DataContractJsonSerializer跳过具有空值的节点

DataContractJsonSerializer用来将我的自定义对象序列化为JSON.但我想跳过其值为的数据成员null.如果DataMembernull该节点不应该在JSON字符串.

我怎样才能做到这一点?给我一个简单code snippet的工作.

c# serialization datacontractserializer datacontractjsonserializer

20
推荐指数
1
解决办法
1万
查看次数

使用DataContractJsonSerializer将Dictionary <TKey,TValue>序列化为JSON

我有一个对象树,我正在序列化为JSON DataContractJsonSerializer.Dictionary<TKey, TValue>得到序列化但我不喜欢标记 - 项目不会像这样呈现:

{key1:value, key2:value2}
Run Code Online (Sandbox Code Playgroud)

而是像一系列序列化KeyValuePair<TKey, TValue>对象:

[{
    "__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
    "key":"key1",
    "value":"value1"
 },     
 {
    "__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
    "key":"key2",
    "value":"value2"
 }]
Run Code Online (Sandbox Code Playgroud)

丑,不是吗?

因此,我通过将通用Dictionary包装在实现的自定义对象中来避免这种情况ISerializable,并且我在GetObjectData方法中实现了自定义序列化(并且它只需要3行).

现在的问题-我不能让我的类从派生Dictionary<TKey, TValue>,所以我实现所有的逻辑(Add,Clear,等),在我的自定义类,被应用到私人Dictionary<TKey, TValue>领域.继承会更好,因为在使用我的自定义对象时,我将拥有所有通用字典功能.

继承的问题是它自己的Dictionary<TKey, TValue>实现ISerializable,并且DataContractJsonSerializer似乎更喜欢这个实现,即使我ISerializable从我的自定义类显式实现,如下所示:

public class MyClass : Dictionary<string, object>, ISerializable
{
    public override void GetObjectData(SerializationInfo info, 
        StreamingContext context)
}
Run Code Online (Sandbox Code Playgroud)

我真的很惊讶这是可能的,因为它允许我实现相同的接口两次而不显然能够使用显式接口实现 - 所以我在一篇关于多接口实现的博客文章中更详细地分析了这种情况

所以,根据我在那里做的实验,序列化器应该调用我的ISerializable实现,无论内部使用什么类型的转换 -

((ISerializable)((Dictionary<,>)obj)).GetObjectData(...)
Run Code Online (Sandbox Code Playgroud)

要么:

((ISerializable)obj).GetObjectData(...)
Run Code Online (Sandbox Code Playgroud)

但它显然没有发生,因为我在生成的JSON中看到KeyValuePair<TKey, TValue> …

.net oop serialization multiple-interface-implem datacontractjsonserializer

15
推荐指数
1
解决办法
3161
查看次数

DataContractJsonSerializer - 在List <object>中反序列化DateTime

我无法使用System.Runtime.Serialization.Json.DataContractJsonSerializer该类反序列化a中包含的DateTime实例List<object>.我似乎无法将DateTime反序列化为原始类型.将DataContractJsonSerializer始终反序列化到一个字符串类型的格式"/Date(1329159196126-0500)/".如果我通过使用强类型运行它,它将序列化和反序列化很好List<DateTime>,但是我正在寻找方法让串行器在简单列表或数组中遇到时识别并正确反序列化DateTimes object.

请注意,除了此列表将包含的基元和字符串之外,DateTimes是唯一的类型.这是我用来测试它的代码片段.

var list = new List<object> { 27, "foo bar", 12.34m, true, DateTime.Now };
var serializer = new DataContractJsonSerializer(typeof (List<object>));
using (MemoryStream ms = new MemoryStream())
{
    serializer.WriteObject(ms, list);
    ms.Position = 0;
    var deserializedList = serializer.ReadObject(ms) as List<object>;
}
Run Code Online (Sandbox Code Playgroud)

c# json datacontractjsonserializer

9
推荐指数
3
解决办法
2万
查看次数

DataContractJsonSerializer人类可读的json

基本上是这个问题的一个显着差异 - 我必须使用DataContractJsonSerializer.

一个简单的

using (var stream = new MemoryStream())
{
    var serializer = new DataContractJsonSerializer(typeof(Person));
    serializer.WriteObject(stream, obj);
    ...
    return stream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

生成单行json,例如(保存在文件中时)

...{"blah":"v", "blah2":"v2"}...
Run Code Online (Sandbox Code Playgroud)

有什么选择可以做到

...
{
    "blah":"v", 
    "blah2":"v2"
}
...
Run Code Online (Sandbox Code Playgroud)

我可以想到后处理......有更简单的选择吗?例如,类似于DataContractSerializer生成的格式化xml

using (var stream = new MemoryStream())
{
    var serializer = new DataContractJsonSerializer(typeof(T));
    // "beautify"
    using (var writer = new SomeKindOfWriter(stream))
        serializer.WriteObject(writer, obj);
    ...
    return stream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法SomeKindOfWriter在需要时美化json?

c# json datacontractjsonserializer

8
推荐指数
1
解决办法
4313
查看次数

DataContractJsonSerializer DateTime隐式时区转换

我在数据库中有一个日期时间,我使用Entity Framework从数据库中检索它,然后我通过DataContractJsonSerializer通过JSON API传递数据.

在DataContractJsonSerializer中处理时,日期时间字段中的时间似乎已根据服务器的本地时区进行了调整.该时期表示时间比预期时间提前1小时.DateTime种类是UTC,但以前它是未指定的,我有同样的问题.

在我的应用程序中,我希望明确地在客户端而不是服务器之间转换时区,因为这更有意义.我对这个隐含功能感到惊讶,因为我的日期时间值应该是一个简单的值,就像一个整数.

谢谢

.net c# json wcf-rest datacontractjsonserializer

7
推荐指数
1
解决办法
4502
查看次数

使用C#.NET Core反序列化json

我试图反序列化我已经通过JSON格式POST但有一些问题的数据.

错误消息是:

SerializationException:期望状态'Element'..遇到名为'',namespace''的'Text'.System.Runtime.Serialization.XmlObjectSerializerReadContext.HandleMemberNotFound(XmlReaderDelegator的XMLReader,ExtensionDataObject extensionData,INT memberIndex)

发生序列化的控制器:

    public String RequestToken(string userData)
    {
            Contract.Ensures(Contract.Result<string>() != null);
            UserModel deserializedUser = new UserModel();
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(userData));
            ms.Position = 0;
            DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedUser.GetType());
            deserializedUser = ser.ReadObject(ms) as UserModel;
    }
Run Code Online (Sandbox Code Playgroud)

用作合同的UserModel:

using System;
using System.Runtime.Serialization;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace WishareIntegrationApi.Entities
{
    [DataContract]
    public class UserModel
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        [DataMember]
        public ObjectId _id { get; set; }
        [DataMember]
        public string displayName { get; set; }
        [DataMember]
        public string photoURL { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# serialization json .net-core datacontractjsonserializer

6
推荐指数
1
解决办法
9597
查看次数

使用DataContractJsonSerializer对JSON对象进行部分反序列化

作为Bitbucket REST API的响应,我得到以下JSON对象(简化版):

{
    "repositories": [
        {
            "scm": "hg",
            "has_wiki": false,            
            "language": "c#",
            "slug": "Repo1"
        },
        {
            "scm": "hg",
            "has_wiki": false,            
            "language": "java",
            "slug": "Repo2"
        },
        {
            "scm": "hg",
            "has_wiki": true,            
            "language": "c#",
            "slug": "Repo3"
        }
    ],
    "user": {
        "username": "someuser",
        "first_name": "Some",
        "last_name": "User",
        "display_name": "Some User",
        "is_team": false,
        "avatar": "https://someuseravatar.com",
        "resource_uri": "/1.0/users/someuser"
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要反序列化这个JSON对象的唯一部分是一个user部分.为此,我创建了以下类:

[DataContract(Name="user")]
public class BitbucketUser
{
    [DataMember(Name = "username")]
    public string Username { get; set; }

    [DataMember(Name = "first_name")]
    public string FirstName …
Run Code Online (Sandbox Code Playgroud)

c# json datacontractserializer deserialization datacontractjsonserializer

5
推荐指数
1
解决办法
7994
查看次数

错误反序列化类型的对象....结束元素'......'从命名空间''预期.从命名空间''找到元素'item'

当我反序列化我的jsonstring时,我收到错误消息

 There was an error deserializing the object of type RecordInfo. End element 'Warning' from namespace '' expected. Found element 'item' from namespace ''.
Run Code Online (Sandbox Code Playgroud)

这是我的JsonString

public const string jsonString = @" 
        {
            ""RequestId"":514106,
            ""Warning"":[],
            ""CustomerData"": {
                ""Email"":""abc@abc.com"",
                ""FullName"":""OrTguOfE"",
                ""OrderData"":[]
            }
        }";
Run Code Online (Sandbox Code Playgroud)

数据合同

[DataContract]
    public class RecordInfo
    {
        [DataMember(Name = "RequestId")]
        public string RequestId { get; set; }

        [DataMember(Name = "Warning")]
        public string Warning { get; set; }

        [DataMember(Name = "CustomerData")]
        public CustomerData CustomerData { get; set; }
    }
 [DataContract]
    public …
Run Code Online (Sandbox Code Playgroud)

c# json datacontractjsonserializer

5
推荐指数
1
解决办法
2万
查看次数

HL7 FHIR序列化到asp.net web api中的json

我正在使用由Ewout Kramer创建的HL7.Fhir nuget package 0.9.3.

我正在使用ASP.NET Web API,但不幸的是,内置的JSON序列化不能正确生成JSON.它包含很多这样的:

"<IdentifierElement>k__BackingField"
Run Code Online (Sandbox Code Playgroud)

正如框架所示,此代码有效......

public HttpResponseMessage GetConformance()
    {
        var conformance = new Conformance();
        var json = FhirSerializer.SerializeResourceToJson(conformance);
        return new HttpResponseMessage{Content = new StringContent(json)};
    }
Run Code Online (Sandbox Code Playgroud)

但这将变得非常重复,并且不遵循Web API的"按惯例"json/xml序列化方法.

是否有其他FHIR对象包可用,或者我应该自己编写?

asp.net-web-api hl7-fhir datacontractjsonserializer

5
推荐指数
1
解决办法
2931
查看次数