我正在尝试使用ServiceStack.Redis,我注意到当我存储一个对象的成员是从另一个对象继承的对象并尝试稍后获取它时,我得到null.
我查了一下,发现ServiceStack.Redis正在使用ServiceStack.JsonSerializer,所以我试图创建一个测试用例:
class Program
{
public class ClassA
{
public string Id;
public Dictionary<string, ClassB> dic = new Dictionary<string, ClassB>();
}
public class ClassB
{
public string Id;
}
public class ClassC : ClassB
{
public object C;
}
public class ClassD
{
public string Id;
}
static void Main(string[] args)
{
ClassA t = new ClassA();
t.Id = Guid.NewGuid().ToString("n");
t.dic.Add("AAA", new ClassC());
t.dic["AAA"].Id = Guid.NewGuid().ToString("n");
((ClassC)t.dic["AAA"]).C = new ClassD();
((ClassD)((ClassC)t.dic["AAA"]).C).Id = Guid.NewGuid().ToString("n");
ServiceStack.Text.JsConfig.IncludeNullValues = true;
ServiceStack.Text.JsConfig.IncludePublicFields = true;
ServiceStack.Text.JsConfig.IncludeTypeInfo …Run Code Online (Sandbox Code Playgroud) 我正在尝试为复杂的对象构建web api.为此,我构建了自定义绑定器,从JSON反序列化此对象.
我的客户活页夹看起来像:
var paramType = p_BindingContext.ModelType;
dynamic updatedParam = Activator.CreateInstance(paramType);
JsonReader reader = new JTokenReader(JObject.Parse
(p_ActionContext.Request.Content.ReadAsStringAsync().Result));
JObject jObject = JObject.Load(reader);
JsonSerializer serializer = new JsonSerializer();
serializer.Populate(jObject.CreateReader(), updatedParam);//Here the exception thorws
p_BindingContext.Model = updatedParam;
Run Code Online (Sandbox Code Playgroud)
序列化的对象非常复杂:
public class ModelRegisterUserRequest{
public ModelUser User { get; set; }
public CampaignItem CampaignWithChosenProposal { get; set; }
public string ValidationToken { get; set; }
public string IVRToken { get; set; }
public string DealerID { get; set; }
public string SalePersonID { get; set; } …Run Code Online (Sandbox Code Playgroud) 我关心的主要是ServiceStack的Redis客户端.我有一堆实体要存储在缓存中.他们的成员大多是封装的(私有的),其中一些没有任何公共访问者.ServiceStack的序列化程序是否允许我在Redis中存储(并显然获得)这些实体?或者我是否必须创建具有序列化公共属性的"干净"POCO类,这将迫使我保留任何实体的2个表示形式:真实的,以及用于将其存储在Redis中的"假"POCO表示形式?
我希望答案不是后者:)
我为web api收集了名称,短语,地理定位图像信息的json数据.通过我的代码,我可以生成JSON数据/ api/wiki/name.但我不能格式化数据.当我想将它保存在一个文件中时,它存储在一行中.我试图在返回结果中写入Formatting.Indented,但它显示错误.我的代码看起来像这样 -
public class WikiController : ApiController
{
public JsonResult<PoiInfo> Get(string id)
{
WebClient client = new WebClient();
var TextResponse = client.DownloadString("https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exlimit=max&explaintext&exintro&titles=" + id + "&redirects=");
var ImageResponse = client.DownloadString(new Uri("https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles=" + id));
var GeoResponse = client.DownloadString("https://en.wikipedia.org/w/api.php?action=query&format=json&prop=coordinates&titles=" + id);
var TextResponseJson = JsonConvert.DeserializeObject<Rootobject>(TextResponse);
var TextfirstKey = TextResponseJson.query.pages.First().Key;
var Text = TextResponseJson.query.pages[TextfirstKey].extract;
Regex regex = new Regex(@".(?<=\()[^()]*(?=\)).(.)");
string.Format("Before:{0}", Text);
Text = regex.Replace(Text, string.Empty);
string TextResult = String.Format(Text);
TextResult = Regex.Replace(TextResult, @"\\n", " ");
var ImgresponseJson = JsonConvert.DeserializeObject<ImgRootobject>(ImageResponse);
var ImgfirstKey …Run Code Online (Sandbox Code Playgroud) 我有案例课
case class User (
id: Option[Long] = None,
username: String,
password: Option[String] = None,
)
Run Code Online (Sandbox Code Playgroud)
这个案例类是json serialiser
object User {
implicit val userWrites: Writes[User] = (
(JsPath \ "id").write[Option[Long]] and
(JsPath \ "username").write[String] and
(JsPath \ "password").write[Option[String]] and
)(unlift(User.unapply))
}
Run Code Online (Sandbox Code Playgroud)
但我不想在api响应中公开密码字段.我怎样才能实现它?
我也使用这个用于Slick在适当的表中读/写数据,我在许多地方,服务层,控制器层使用它,我不想为api响应创建单独的类(没有密码).
所以我还没有编写我现在正在处理的代码,我正在寻找如何最好地处理这个问题。
现在我有这个。
public static void WriteSymbol(Stream stream, Symbol symbol)
{
using (var streamWriter = new StreamWriter(stream))
{
JsonSerializer.Create(SerializerSettings).Serialize(streamWriter, symbol);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中完成此操作后,我希望能够读取流的内容,以便我可以检查集成。问题是现在在 Serialize 流关闭后我无法再读取它。
我看到了 JsonWriter,public bool CloseOutput { get; set; }但我没有看到这个静态 JsonSerializer 的内容。
解决这个问题的最佳方法是什么?如何防止序列化程序关闭流?有什么方法可以检查流的内容吗?
我试图将一堆XML文件解析为一个已经正常工作的JSON文件.
最终的JSON文件如下所示:
{
"items": [
{
"subItems": [
{
"Name": "Name",
"Value": "Value",
"Type": "text"
},
{
"Name": "Name",
"Value": "Value",
"Type": "text"
}
]
},
{
"subItems": [
{
"Name": "Name",
"Value": "Value",
"Type": "text"
},
{
"Name": "Name",
"Value": "Value",
"Type": "text"
},
...
Run Code Online (Sandbox Code Playgroud)
相反,我想实现以下结构:
{
"items": [
[
{
"Name": "Name",
"Value": "Value",
"Type": "text"
},
{
"Name": "Name",
"Value": "Value",
"Type": "text"
}
],
[
{
"Name": "Name",
"Value": "Value",
"Type": "text"
},
{
"Name": "Name", …Run Code Online (Sandbox Code Playgroud) 我需要将JSONobj 映射到一个类及其数组ArrayList,Android并且它应该包含所有子数据.(也有嵌套的arraylists),我需要再次将更新的数据列表转换为jsonobject
我的json字符串是
{
"type": "already_planted",
"crops": [
{
"crop_id": 1,
"crop_name": "apple",
"crop_details": [
{
"created_id": "2017-01-17",
"questions": [
{
"plants": "10"
},
{
"planted_by": "A person"
}
]
},
{
"created_id": "2017-01-30",
"questions": [
{
"plants": "15"
},
{
"planted_by": "B person"
}
]
}
]
},
{
"crop_id": 2,
"crop_name": "Cashew",
"crop_details": [
{
"created_id": "2017-01-17",
"questions": [
{
"plants": "11"
},
{
"planted_by": "c person"
}
]
}
] …Run Code Online (Sandbox Code Playgroud) 似乎当我使用自定义序列化程序时,它@JsonInclude(Include.NON_NULL)会被完全忽略。
我的要求是不要序列化值为空的键。我还想通过为多值添加空格分隔符来格式化字符串SortedSet(这就是我创建自定义序列化程序的原因)
没有任何空值的电流输出示例
{
"age": "10",
"fullName": "John Doe"
"email":"doe@john.com john@doe.com test@gmail.com"
}
Run Code Online (Sandbox Code Playgroud)
具有空值的电流输出示例
{
"age": "10",
"fullName": "John Doe"
"email":null
}
Run Code Online (Sandbox Code Playgroud)
电子邮件为空时的预期输出:
{
"age": "10",
"fullName": "John Doe"
}
Run Code Online (Sandbox Code Playgroud)
DTO
@AllArgsConstructor
@Builder
@Data
@NoArgsConstructor
@ToString
@SuppressWarnings("PMD.TooManyFields")
public class User {
@JsonProperty("age")
private String age;
@JsonProperty("firstName")
private String name;
@JsonProperty("email")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonSerialize(using = MultiValuedCollectionSerializer.class)
private SortedSet<String> email;
}
Run Code Online (Sandbox Code Playgroud)
自定义序列化程序
public class MultiValuedCollectionSerializer extends JsonSerializer<Collection> {
@Override
public void serialize(final Collection inputCollection,
final JsonGenerator jsonGenerator,
final SerializerProvider …Run Code Online (Sandbox Code Playgroud) 当以下 POCO 类的“Salary”字段的十进制值为 12000M(十进制值)时,Swagger UI 将 JSON 属性值显示为 12000。而预期的 JSON 属性值为 12000.0(即尾随零)。
在startup.cs的“ConfigureServices(IServiceCollection services)”方法中使用以下代码:
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.FloatParseHandling = FloatParseHandling.Decimal;
options.SerializerSettings.FloatFormatHandling = FloatFormatHandling.DefaultValue;
});
services.AddControllersWithViews().AddNewtonsoftJson(options =>
{
options.SerializerSettings.FloatParseHandling = FloatParseHandling.Decimal;
options.SerializerSettings.FloatFormatHandling = FloatFormatHandling.DefaultValue;
});
Run Code Online (Sandbox Code Playgroud)
还使用了以下代码片段,但 Swagger UI 中没有出现预期的输出。(在 Swashbuckle.AspNetCore.Newtonsoft V6.1.4.0 中)
services.AddAwaggerGenNewtonsoftSupport();
Run Code Online (Sandbox Code Playgroud)
当上面的代码片段不起作用时,也尝试以下。但没有运气。
services.AddMvc().AddNewtonsoftJson(options =>
{
options.SerializerSettings.FloatParseHandling = FloatParseHandling.Decimal;
options.SerializerSettings.FloatFormatHandling = FloatFormatHandling.DefaultValue;
});
Run Code Online (Sandbox Code Playgroud)
班级:
public class Employee{
public string EmployeeName {get; set;}
public decimal Salary {get; set;}
public string Department {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
看起来,即使添加上述代码片段后,Swagger UI 也没有使用 Newtonsoft.Json 来序列化十进制,而是使用 …
jsonserializer json.net swagger-ui asp.net-core system.text.json
jsonserializer ×10
c# ×5
json ×4
json.net ×4
java ×2
servicestack ×2
android ×1
asp.net-core ×1
asp.net-mvc ×1
formatting ×1
gson ×1
java-11 ×1
redis ×1
stream ×1
streamwriter ×1
swagger-ui ×1