在将xml文件序列化为.net c#对象后,我在返回的json中获取k_BackingField.
我已经将DataContract和DataMember属性添加到.net c#对象中,但是在json,客户端没有得到任何结果.
[XmlRoot("person")]
[Serializable]
public class LinkedIn
{
[XmlElement("id")]
public string ID { get; set; }
[XmlElement("industry")]
public string Industry { get; set; }
[XmlElement("first-name")]
public string FirstName { get; set; }
[XmlElement("last-name")]
public string LastName { get; set; }
[XmlElement("headline")]
}
Run Code Online (Sandbox Code Playgroud)
返回的json示例:
home: Object
<FirstName>k__BackingField: "Storefront"
<LastName>k__BackingField: "Doors"
Run Code Online (Sandbox Code Playgroud) 我做了很多研究,但我对我发现的东西并不完全满意.只是为了确定这是我的问题:什么是将JSON反序列化为TypeScript运行时类实例的最强大,最优雅的自动化解决方案?
说我上了这堂课:
class Foo {
name: string;
GetName(): string { return this.name };
}
Run Code Online (Sandbox Code Playgroud)
并说我有这个JSON字符串用于反序列化:
{"name": "John Doe"}
Run Code Online (Sandbox Code Playgroud)
获取名称设置为"John Doe"和GetName()方法的Foo类实例的最佳和最易维护的解决方案是什么?我非常具体地问,因为我知道很容易反序列化为纯数据对象.我想知道是否可以使用工作方法获取类实例,而无需进行任何手动解析或任何手动数据复制.如果无法实现全自动化解决方案,那么下一个最佳解决方案是什么?
.NET Framework附带了System.Runtime.Serialization.Json.DataContractJsonSerializer和System.Web.Script.Serialization.JavaScriptSerializer,它们都是对JSON进行de/serialize.我如何知道何时选择其中一种类型?MSDN没有说清楚它们的相对优势是什么.
我们有几个消耗或发出JSON的项目,到目前为止为每个项目选择的类依赖于每个项目的主要开发者的意见.有些很简单,有两个有关于从JSON生成托管类型的复杂逻辑(类型没有紧密地映射到流)但是没有强调速度,需要速度.没有与WCF交互,至少截至目前.
虽然我对其他图书馆感兴趣,但我希望有人也可以回答我的问题.
我正在寻找最快的序列化和反序列化.NET对象的方法.这是我到目前为止:
public class TD
{
public List<CT> CTs { get; set; }
public List<TE> TEs { get; set; }
public string Code { get; set; }
public string Message { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public static string Serialize(List<TD> tData)
{
var serializer = new XmlSerializer(typeof(List<TD>));
TextWriter writer = new StringWriter();
serializer.Serialize(writer, tData);
return writer.ToString();
}
public static List<TD> Deserialize(string tData)
{
var serializer = new XmlSerializer(typeof(List<TD>));
TextReader …Run Code Online (Sandbox Code Playgroud) 我的JSON如下:
{"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]}
Run Code Online (Sandbox Code Playgroud)
我找到了针对C#的Newtonsoft JSON.NET反序列化库.我尝试使用它如下:
object JsonDe = JsonConvert.DeserializeObject(Json);
Run Code Online (Sandbox Code Playgroud)
如何访问该JsonDe对象以获取所有"类型"数据?我尝试了一个循环,但它没有工作,因为该对象没有枚举器.
我试图移动一些代码来使用ASP.NET MVC Web API生成的Json数据而不是SOAP Xml.
我遇到了序列化和反序列化类型属性的问题:
IEnumerable<ISomeInterface>.
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子:
public interface ISample{
int SampleId { get; set; }
}
public class Sample : ISample{
public int SampleId { get; set; }
}
public class SampleGroup{
public int GroupId { get; set; }
public IEnumerable<ISample> Samples { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用以下命令轻松序列化SampleGroup的实例:
var sz = JsonConvert.SerializeObject( sampleGroupInstance );
Run Code Online (Sandbox Code Playgroud)
但是相应的反序列化失败:
JsonConvert.DeserializeObject<SampleGroup>( sz );
Run Code Online (Sandbox Code Playgroud)
使用此异常消息:
"无法创建JsonSerializationExample.ISample类型的实例.Type是接口或抽象类,无法立即显示."
如果我派生出一个JsonConverter,我可以按如下方式装饰我的属性:
[JsonConverter( typeof (SamplesJsonConverter) )]
public IEnumerable<ISample> Samples { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是JsonConverter:
public class SamplesJsonConverter : …Run Code Online (Sandbox Code Playgroud) 我决定是否使用方形或Gson的Moshi来序列化和反序列化模型数据.
我总是不喜欢Gson的一件事是我认为它使用的反射在Android上可能很慢?莫希也使用反射吗?
moshi vs Gson的优点和缺点是什么?
我觉得它们很相似.以此语句为例,创建一个typeAdapter:
class CardAdapter {
@ToJson String toJson(Card card) {
return card.rank + card.suit.name().substring(0, 1);
}
@FromJson Card fromJson(String card) {
if (card.length() != 2) throw new JsonDataException("Unknown card: " + card);
char rank = card.charAt(0);
switch (card.charAt(1)) {
case 'C': return new Card(rank, Suit.CLUBS);
case 'D': return new Card(rank, Suit.DIAMONDS);
case 'H': return new Card(rank, Suit.HEARTS);
case 'S': return new Card(rank, Suit.SPADES);
default: throw new JsonDataException("unknown suit: " + card);
} …Run Code Online (Sandbox Code Playgroud) 如何使用gson 2.2.4对这样的简单枚举进行序列化和反序列化?
public enum Color {
RED, BLUE, YELLOW;
}
Run Code Online (Sandbox Code Playgroud) 我有一个预定义数据结构的对象:
public class A
{
public string Id {get;set;}
public bool? Enabled {get;set;}
public int? Age {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
和JSON应该是
{ "Id": "123", "Enabled": true, "Age": 23 }
Run Code Online (Sandbox Code Playgroud)
我想以积极的方式处理JSON错误,并且每当服务器返回已定义数据类型的意外值时,我希望它被忽略并且默认值被设置(null).
现在,当JSON部分无效时,我收到JSON读卡器异常:
{ "Id": "123", "Enabled": "NotABoolValue", "Age": 23 }
Run Code Online (Sandbox Code Playgroud)
而且我根本没有任何对象.我想要的是获得一个对象:
new A() { Id = "123", Enabled = null, Age = 23 }
Run Code Online (Sandbox Code Playgroud)
并在可能的情况下解析警告.是否可以使用JSON.NET完成?
我有一个实现Serializable的公共类,它由多个其他类扩展.之前只有那些子类被序列化 - 从来不是超类.
超类定义了一个serialVersionUID.
我不确定它是否重要,但它没有标记为私有,而是它只是默认保护 - 你可能会说它是包保护
static final long serialVersionUID = -7588980448693010399L;
Run Code Online (Sandbox Code Playgroud)
但是,超类或任何子类都实现了readObject或writeObject,并且没有子类具有明确定义的serialVersionUID.我认为超类中定义的一个就足够了.
尽管如此,只要读回以前的序列化对象,直到新的实例变量,List/ArrayList以及新方法被添加到超类中,并且一些私有实例变量被添加到其子类之一,就可以了. .
现在,当尝试读回先前序列化的对象时,会抛出异常.一个类似于此:
com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196
Run Code Online (Sandbox Code Playgroud)
我假设这是因为默认的serialVersionUID,因为我没有在任何子类中声明一个而使用,现在由于超类和一个子类的变化而改变了.
关于如何摆脱这种困境的建议将不胜感激.我假设我需要实现readObject和writeObject,但除了调用defaultReadObject()和defaultWriteObject()之外,我不确定我需要做什么.我也不知道是否需要将serialVerisonUID添加到所有子类中,或者是否需要每个子类实现readObject和writeObject,或者我是否可以实现它们一次,假设我需要在超类中完成.