使用下面的代码,我如何使用DataContractJsonSerializer将结果列表转换为JSON?
ETA:我已经看到了一些通用JSON-ize对象的扩展方法,但我不确定使用什么类型,因为这是一个匿名类型.
<Product> products = GetProductList();
var orderGroups =
from p in products
group p by p.Category into g
select new { Category = g.Key, Products = g };
Run Code Online (Sandbox Code Playgroud)
谢谢!
是否有任何工具允许基于JSON样本生成DataContract实体定义?我真的错过了使用代码生成工具的旧的优秀WSDL元数据.
c# serialization json datacontract datacontractjsonserializer
我使用DataContractJsonSerializer并StringContent以JSON发送到Web服务:
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Employee));
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, employee);
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
StringContent jsonContent = new StringContent(sr.ReadToEnd(),
System.Text.Encoding.UTF8, "application/json");
// later I do HttpClient.PostAsync(uri, jsonContent)
Run Code Online (Sandbox Code Playgroud)
这会导致此Content-Type标头:
Content-Type: application/json; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
是否有可能离开字符集,只是有以下标题?
Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)
我没有看到一个超载StringContent就是这个.
我正在尝试为内部存储数据的集合编写接口 JObject
internal class JsonDataSet : IDataSet
{
private JObject Document { get; set; }
// The following methods are from the IDataSet interface
public int Count { ... }
public void Add<T>(string key, T value) { ... }
public T GetItem<T>(string key) { ... }
public bool ContainsKey(string key) { ... }
}
Run Code Online (Sandbox Code Playgroud)
在Add<T>方法中,如果自定义类型没有DataContract注释,我想提供一个有用的例外.例如,如果有人打电话:
dataSet.Add<IDictionary<string, IList<CustomType>>>(dict);
Run Code Online (Sandbox Code Playgroud)
"Cannot serialize type 'CustomType'. DataContract annotations not found."如果CustomType没有正确的注释,它将抛出异常.
到目前为止,我已经找到了一种方法来获取类型定义中的每个泛型参数,以便我可以检查它们:
private IEnumerable<Type> GetGenericArgumentsRecursively(Type type)
{
if (!type.IsGenericType) …Run Code Online (Sandbox Code Playgroud) 好,
我正在使用System.Runtime.Serialization和DataContractJsonSerialization.
问题是在请求中我发送了一个带有该&字符的属性值.说,AT&T我得到一个错误的回复:Invalid JSON Data.
我认为转义将在库内完成,但现在我看到序列化没有触及&符号&.
是的,对于JSON格式,这是有效的.但是这对我的POST请求来说是一个问题,因为我需要将它发送到一个服务器,如果包含一个&符号会响应错误,因此我在这里.
HttpUtility.HtmlEncode在System.Web图书馆,所以要走的路是使用Uri.EscapeUriString.我这样做是为了尝试,但无论如何,没有它,所有请求都工作正常,除了一个&符号值.
编辑:HttpUtility类被移植到Windows Phone SDK,但编码字符串的首选方法应该仍然是Uri.EscapeUriString.
首先想到的是弄脏并开始更换会导致服务器出现问题的特殊字符,但是,我想知道,我应该做的另一个解决方案是,它是否有效且"正确"?
我应该说我用了
// Convert the string into a byte array.
byte[] postBytes = Encoding.UTF8.GetBytes(data);
Run Code Online (Sandbox Code Playgroud)
将JSON转换为a byte[]并写入Stream.和,
request.ContentType = "application/x-www-form-urlencoded";
Run Code Online (Sandbox Code Playgroud)
作为WebRequest.ContentType.
那么,我是因为某种原因而搞砸了?
谢谢.
c# json httpwebrequest windows-phone-8 datacontractjsonserializer
我正在使用网络服务获取有关路线里程的数据.然后我使用反序列化器来解析它.以下是JSON的外观:
[{"__type":"CalculateMilesReport:http:\/\/pcmiler.alk.com\/APIs\/v1.0","RouteID":null,"TMiles":445.5]
Run Code Online (Sandbox Code Playgroud)
有了这个回应,我有几个问题.为什么包装成集合,如何设置对象模型?它还抱怨特殊的__type属性.所以,我做了"黑客"和"准备"字符串:
// Cut off first and last charachters [] - they send objects as arrays
rawJSON = rawJSON.Substring(1, rawJSON.Length - 2);
// Hide "__type" attribute as it messes up serializer with namespace
rawJSON = rawJSON.Replace("__type", "type");
Run Code Online (Sandbox Code Playgroud)
然后一切都使用这个对象:
[DataContract]
public class PCMilerResponse
{
[DataMember(Name = "Errors", EmitDefaultValue = false)]
public PCMilerError[] Errors { get; set; }
[DataMember(Name = "TMiles", EmitDefaultValue = false)]
public decimal DrivingDistance { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我修改了对Web服务的调用,我得到了以下响应
[
{"__type":"CalculateMilesReport:http:\/\/pcmiler.alk.com\/APIs\/v1.0","RouteID":null,"TMiles":445.5},
{"__type":"GeoTunnelReport:http:\/\/pcmiler.alk.com\/APIs\/v1.0","RouteID":null,"GeoTunnelPoints":
[{"Lat":"34.730466","Lon":"-92.247147"},{"Lat":"34.704863","Lon":"-92.29329"},{"Lat":"34.676312","Lon":"-92.364654"},{"Lat":"29.664271","Lon":"-95.236735"}]
}
]
Run Code Online (Sandbox Code Playgroud)
现在有理由为什么有数组和"__type".但我不确定如何编写对象来正确解析它.我想需要应用特殊属性,可能需要通用数组吗?有关如何正确反序列化的任何帮助?
PS我可以做更多的黑客攻击并替换那些使其成为对象的字符串,但我不知道是否有"正确"的方法来处理它.
.net c# json datacontractserializer datacontractjsonserializer
我有一个包含项目列表的类.我想使用DataContractJsonSerializer作为json数组将此类的实例序列化为json.例如.
class MyClass
{
List<MyItem> _items;
}
class MyItem
{
public string Name {get;set;}
public string Description {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
当序列化为json时,它应该是这样的:
[{"Name":"one","Description":"desc1"},{"Name":"two","Description":"desc2"}]
我试图避免依赖开源或第三方库(如Json.NET)来解析来自HttpWebResponse的传入JSON.为什么?因为越来越依赖开源框架来帮助实现,你的应用程序必须依赖这些依赖关系...我不喜欢我的应用程序在许多库中依赖于很多原因,如果可能的话.我可以使用像Enterprise Library这样的东西,因为它得到了MS的支持,但是我正在使用更多的开源库.
无论如何,我试图找出在.NET 3.5中解析传入JSON服务器端的最佳方法.
我知道这会得到很多响应,我甚至使用.NET 3.5 JavaScriptSerializer将数据序列化为JSON,但现在我正试图找出最好和最简单的方法来做反向,不用再做了使用第三方/开源框架来帮助实现这一目标.
我正在使用.net datacontractjsonserializer将我的对象列表序列化为JSON字符串,但是有些公共属性我不想序列化,如何防止datacontractjsonserializer序列化这些属性?
谢谢
是否有DataContractSerializer 可以处理的序列化/反序列化方案,而DataContractJsonSerializer 不能?
特别是,我正在考虑循环引用:这个MSDN页面解释了如何DataContractSerializer通过IsReference = true在DataContractAttribute构造函数中使用来管理循环引用.另一方面,DataContractAttribute.IsReference文档没有明确声明其适用性仅限于DataContractSerializer.
会不会DataContractJsonSerializer也兑现了IsReference财产?
.net c# json datacontractserializer datacontractjsonserializer
我想使用DataContractJsonSerializer序列化为JsonFormat中的文件。问题在于该WriteObject方法只有XmlWriter,XmlDictionaryWriter和Stream三个选项。
为了得到我想要的东西,我使用了以下代码:
var js = new DataContractJsonSerializer(typeof(T), _knownTypes);
using (var ms = new MemoryStream())
{
js.WriteObject(ms, item);
ms.Position = 0;
using (var sr = new StreamReader(ms))
{
using (var writer = new StreamWriter(path, false))
{
string jsonData = sr.ReadToEnd();
writer.Write(jsonData);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是唯一的方法还是我错过了什么?