JSON.NET通过使用以下设置保留所有引用来支持循环引用序列化:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
Run Code Online (Sandbox Code Playgroud)
这允许以下代码无错误地运行,正确地序列化和反序列化对象及其自引用完整.
public class SelfReferencingClass
{
public string Name;
public SelfReferencingClass Self;
public SelfReferencingClass() {Name="Default"; Self=this;}
}
SelfReferencingClass s = new SelfReferencingClass();
string jsondata = JsonConvert.SerializeObject( d, settings );
s = JsonConvert.DeserializeObject<SelfReferencingClass>( jsondata, settings );
Run Code Online (Sandbox Code Playgroud)
jsondata字符串如下所示:
{"$id":"1","Name":"Default","Self":{"$ref":"1"}}
Run Code Online (Sandbox Code Playgroud)
问题是......如果没有可以解释这些引用的相应客户端JavaScript库,JSON.NET的这个特性是如何有用的,并且还支持编码这样的引用本身?
什么客户端库(例如JSON.stringify)使用"$ id"和"$ ref"字段支持此功能/编码?如果不存在,是否有一种已知的方法来添加对现有库的支持?
自己添加支持将是一个非常简单的双通过程.首先,反序列化整个字符串,并在创建每个对象时使用其"$ id"值作为键将其添加到字典中.当您遇到引用(仅包含"$ ref"属性的对象)时,您可以将其添加到object + fieldname列表中,您可以通过在已创建对象的最终字典中查找其键来返回以替换每个遇到的引用.
serialization json jsonserializer json.net circular-reference
我使用Flexjson将这样的类序列化为JSON:
public class Item {
private Long id;
private String name;
private String description;
...
// Getters and setters
...
}
Run Code Online (Sandbox Code Playgroud)
许多Item字段可以为null(例如,描述).因此,当使用Flexjson序列化这样的Item对象时,我得到以下JSON:
{"id":62,"name":"Item A","description":null,...}
Run Code Online (Sandbox Code Playgroud)
因为,正如我已经提到的,Item对象可能包含许多空值字段,因此输出的JSON比实际需要的长.到目前为止这是一个问题,因为我想通过WiFi,3G,EDGE或GPRS通过无线连接将生成的JSON从Web服务器发送到移动客户端(即,需要更多带宽,这会导致速度降低).
因此,我想问一下如何使用Flexjson(有效地)排除空值属性?
谢谢!
我有一个简单的数据服务:
@GET
public Data getData(@QueryParam("id") Long id) {
Data data = dataService.getData(id);
return data;
}
Run Code Online (Sandbox Code Playgroud)
和匹配DataSerializer实现JsonSerializer<Data>:将DataSerializer通过注册到杰克逊:
simpleModule.addSerializer(Data.class , dataSerializer);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(simpleModule);
Run Code Online (Sandbox Code Playgroud)
它运作良好.但今天,我想添加另一个Locale参数,并希望DataSerializer输出相应的内容:
@GET
public Data getData(@QueryParam("id") Long id , @QueryParam("locale") Locale locale)
Run Code Online (Sandbox Code Playgroud)
' Data'本身包含各种语言环境变体,我希望获得指定的语言环境输出.
但是当我locale从参数中获取时,我不知道如何将locale值传递给DataSerializer...
反正有没有实现这个目标?
除了这个解决方案:
Data data = dataService.getData(id.get() , locale);
Run Code Online (Sandbox Code Playgroud)
这不是我想要的.
这似乎ThreadLocal是实现这一目标的唯一方法,但我觉得这很难看.还有其他任何可行的解
谢谢.
环境:dropwizard-0.7.0-rc2,jackson-core:jar:2.3.1
=====================更新==========
回复@ andrei-i:
因为我的数据本身已包含各种语言环境版本.例如 :
Data helloData = dataService.get("hello");
helloData.getName(Locale.English) …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 DocumentSnap 从 Firebase 映射到 Flutter 中的 Json 类。我可以确认我正在从文档中获取数据,但我无法将收集的数据传递给我的 Json 对象。我已附上代码和错误消息。
用于从 Firebase DatabaseService.dart 获取文档的类
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:oast_app/widgets/auth_class.dart';
class FireTest {
Future<List<UserCheck>> streamUser(FirebaseUser user) async {
DocumentSnapshot querySnapshot =
await Firestore.instance.collection('users').document(user.uid).get();
if (querySnapshot.exists) {
print('success');
print(querySnapshot.data['fname']);
print(querySnapshot.data['lname']);
querySnapshot.data.map<String, dynamic>((json) => UserCheck.fromJson(json)); **this is whats erroring**
}
return [];
}
}
Run Code Online (Sandbox Code Playgroud)
Json 对象类
import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';
part 'auth_class.g.dart';
@JsonSerializable(nullable: false)
class UserCheck extends ChangeNotifier {
final String uid;
final String fName;
final String lName;
final String regEmail; …Run Code Online (Sandbox Code Playgroud) 当您有一个 MVC 应用程序时,您可以附加 services.AddMvc().AddJsonOptions(options => ... ,这将为所有控制器设置 Json 选项。
Blazor 服务器应用程序的等效项是什么?我试过 services.AddRazorPages().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNameCaseInsensitive = true); 虽然编译器没有抱怨它似乎没有达到预期的效果,但我仍然必须执行以下操作才能正确反序列化:
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var list = await JsonSerializer.DeserializeAsync<IEnumerable<CustomerSearchResultDto>>(await response.Content.ReadAsStreamAsync(), options);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?提前致谢。
我们知道在MVC中,a CheckBoxFor将生成一个checkbox带a value="true"和a hidden带a value=false.两个输入控件将共享相同的名称.
这是非常合理的,因为如果未选中该框,表单将能够POST一个假值.当复选框返回true时,模型绑定器将忽略隐藏的输入.
但是现在我已经覆盖了表单提交事件,以便将表单数据发送到JSON格式的WebAPI控制器.
序列化表单数据时,没有机制来正确解析复选框和隐藏之间的关系.因此,当取消选中时,它会返回一个false,这没关系.但是当检查时,它返回一个{true, false}而不是true,因为该serializeArray()函数遍历每个input并且发现两个值变为同一个名称.
问题是:纠正它的最佳方法是什么?
这是我的项目的实体类
导入 java.util.Iterator;
导入 java.util.Map;
导入 java.util.Set;
@实体
@Table(名称=“培训”)
公开课培训{
@ID
@GeneratedValue
私人长ID;
私人字符串主题;
@OneToMany(mappedBy="训练")
私人设置会话 = 新 HashSet();
公共培训(){
}
公共培训(字符串主题,过渡级别级别,设置会话){
this.topic = 主题;
this.level = 级别;
this.sessions = 会话;
}
公共长 getId() {
返回标识;
}
公共无效 setId(长 ID){
this.id = id;
}
公共字符串 getTopic() {
返回主题;
}
公共无效设置主题(字符串主题){
this.topic = 主题;
}
公共设置 getSessions() {
返回会话;
}
公共无效setSessions(设置会话){
this.sessions = 会话;
}
}
这是会话表
@实体
@Table(名称=“会话”)
公共课会话{
@ID
@GeneratedValue
私人长ID;
私人字符串位置;
@ManyToOne
@JoinColumn(name="training_id")
@JsonIgnore
私人培训培训;
私人日期开始;
私人日期结束;
@JoinTable(name="session_user", … 我的 Windows 窗体应用程序上有一个 datagridview,它接受用户的输入。我想使用 JSON 来存储此输入,并尝试将 datagridview 中的输入序列化为 JSON。
到目前为止我有:
private void button2_Click(object sender, EventArgs e)
{
string output = JsonConvert.SerializeObject(this.dataGridView1);
System.IO.File.WriteAllText("json.json", output);
}
Run Code Online (Sandbox Code Playgroud)
然而,在尝试序列化 datagridview 时似乎出现了问题(之前我的印象是任何对象都可以转换?)。这是否意味着我必须将 datagridview 转换为数组或列表或类似的东西才能序列化它?
我有以下两个类,其中一个类是从另一个类扩展而来的:
@JsonSerializable(nullable: true)
class Response {
final String responseCode;
final String responseMessage;
final String errorLog;
Response({this.errorLog, this.responseCode, this.responseMessage});
factory Response.fromJson(Map<String, dynamic> json) =>
_$ResponseFromJson(json);
}
Run Code Online (Sandbox Code Playgroud)
………………………………………………………………………………………………………………………………………………………… ......
@JsonSerializable(nullable: false)
class Verify extends Response {
Data data;
Verify({
this.data,
});
factory Verify.fromJson(Map<String, dynamic> json) => _$VerifyFromJson(json);
Map<String, dynamic> toJson() => _$VerifyToJson(this);
}
Run Code Online (Sandbox Code Playgroud)
每当我试图从验证类读取响应类属性时,总是为空
那么请如何实现这一目标?
我遇到了有关将结构序列化为 JSON 的问题。所以,我有一个结构“坐标”
\nnamespace CoordinatesNameSpace\n{\n public struct Coordinates\n {\n public Coordinates(string key, string x, string y, string z)\n {\n this.key = key;\n this.x = x;\n this.y = y;\n this.z = z;\n }\n public string key;\n public string x;\n public string y;\n public string z;\n public override string ToString()\n {\n return $"{key} {this.x} {this.y} {this.z}";\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n所有属性都是公共的,所以我期望 json 序列化器将返回我 { "key": "v", "x": "0.12331212" ... },但它只返回一个空对象。
\nusing CoordinatesNameSpace;\n\nnamespace ObjToJSON\n{\n class Program\n {\n static void Main(string[] args)\n {\n …Run Code Online (Sandbox Code Playgroud) jsonserializer ×10
json ×6
c# ×2
flutter ×2
jackson ×2
java ×2
asp.net-mvc ×1
blazor ×1
checkbox ×1
dart ×1
datagridview ×1
dropwizard ×1
firebase ×1
flexjson ×1
hibernate ×1
inheritance ×1
jax-rs ×1
json.net ×1